利用Python進行數據分析 第6章 數據加載、存儲與文件格式(1)


學習時間:2019/10/20 周日下午17點開始。

學習目標:Page164-Page,共23頁,目標3天學完,每天8頁,預期1021學完。

實際反饋:第一天較為集中的學習7頁,用時2.5小時。實際1025學完,耗時5天,2.5+5*1=7.5小時

 

  • 輸入輸出通常可划分為幾個大類:

讀取文本文件和其他更高效的磁盤存儲格式,加載數據庫中的數據,利用Web API操作網絡資源。

 

6.1 讀寫文本格式的數據

pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數,總結如下表。

其中,read_csv和read_table可能會在今后用的最多。

表6-1

  Ps:簡介這些函數在將文本數據轉換為DataFrame時多用到的一些技術。這些函數的選項可划分為以下幾個大類:

  • 索引:將一個或多個列當做返回的DataFrame處理,以及是否從文件、用戶獲取列名。
  • 類型推斷和數據轉換:包括用戶定義值的轉換、和自定義的缺失值標記列表等。
  • 日期解析:包括組合功能,比如將分散在多個列中的日期時間信息組合成結果中的單個列。
  • 迭代:支持對大文件進行逐塊迭代。
  • 不規整數據問題:跳過一些行、頁腳、注釋或其他一些不重要的東西(比如由成千上萬個逗號隔離開的數值數據)。

1)使用read_csv讀取以逗號分隔的(CSV)文本文件:

Ps:Win環境下,文件路徑的書寫格式以下 3 種均正確:

  df = pd.read_csv(r"D:\Python\examples\ex1.csv")

  df1 = pd.read_csv("D:/Python/examples/ex1.csv")

  df2 = pd.read_csv("D:\\Python\\examples\\ex1.csv")

 

2)還可使用read_table讀取CSV文件,並指定分隔符:

3)並非所有文件都有標題,如下圖所示。讀入該類文件有如下兩種方法: 

  Ps1:win系統下,用cmd通過Type命令查看文件文本內容方法:

    1 - 按下快捷鍵:WIN+R,調出運行窗口,輸入:CMD;

    2 - CMD的TYPE指令,語法:type 驅動器:\文件夾\文件名

       3 - 示例:type D:\Python\examples\ex2.csv

  Ps2:win系統下,IPython中通過type查看文件文本內容方法:

    ! type "D:\Python\examples\ex4.csv" ——絕對路徑

方法一:可以讓pandas為其分配默認的列名;

方法二:利用pandas為其自定義列名:

  Ps:如果希望將message列做成DataFrame的索引。可明確表示要將該列放到索引 4 的位置上,也可通過index_col參數指定“message”

  

4)將多個列做成一個層次化索引,只需傳入列編號或列名組成的列表即可:

5)有的情況下,有些表格可能不是用固定的分隔符去分隔字段的(比如,空白符或其他模式)

  如,讀取下面的文本文件:

   

  雖然可手動對數據進行規整,但是較為繁瑣。該情況下,可傳遞一個正則表達式作為read_table的分隔符。可用正則表達式:\s+

  (\s匹配任何空白字符,包括空格、制表符、換頁符等等, 等價於[ \f\n\r\t\v];“\s+”則表示匹配任意多個上面的字符) 

解析器函數還有許多參數可以幫助處理各種各樣的異形文件格式(如表6-2中所示)。簡單示例,可用skiprows跳過文件的第一行、第三行和第四行:

 

6)處理缺失值

缺失值處理,時文件解析任務中的一個重要組成部分。缺失數據經常沒有(空字符串),或用某個標記值表示。

默認情況下,pandas會用一組經常出現的標記值進行識別,比如NA或NULL。

na_values可以用一個列表或集合的字符串表示缺失值(???嘗試多種方式,似乎並無作用)

字典的各列可以使用不同的NA標記值:

 

表6-2 pandas.read_csv / pandas.read_table函數的常用參數選項

 

6.1.1 逐塊讀取文本文件

當在處理很大的文件時,或找出大文件中的參數集以便於后續處理時,可能只想讀取文件的一小部分,或者逐塊對文件進行迭代。

在看大文件前,可先設置pandas顯示更加緊湊:

1)如果只想讀取幾行,通過nrows進行指定即可:

 

2)可通過指定chunksize(行數),進行逐塊讀取文件 ???有問題不懂

read_csv所返回的這個TextParser對象使你可以根據chunksize對文件進行逐塊迭代。

如,對ex6.csv進行迭代處理,將值計數聚合到“key”列中:

 

???????

 

6.1.2 將數據寫出到文本格式

1)利用DataFrame的to_csv方法,將數據寫到一個以逗號分隔的文件中

先讀取一個csv文件:

  Ps:還可使用其他分隔符:

   

  注:因此處直接寫出到sys.stdout,故僅僅是打印出文本結果

缺失值在輸出結果中會被表示為空字符串。如果希望將其表示為別的標記值:

  注:因此處直接寫出到sys.stdout,故僅僅是打印出文本結果

禁用行和列的標簽:

自定義輸出列,並按指定順序排列:

 

2)Series用to_csv方法

 

6.1.3 處理分隔符格式

大部分存儲在磁盤上的表格型數據都能用pandas.read_table進行加載。但對於含有畸形行的文件,則該方法可能無法處理。介紹其他方法如下:

1)對於任何單字符分隔文件,可以直接用python內置的csv模塊,將任意已打開的文件或文件型的對象傳給csv.reader。

對這個reader進行迭代將會為每行產生一個元組(並移除所有的引號):

注意:open()函數使用時,一定要加上encoding='utf-8',否則會進行報錯:UnicodeDecodeError

!!!延申:read_csv時開頭出現 \ufeff ,且引號並未完全去除,不符合預期。

  首行出現的“\ufeff”叫BOM("ByteOrder Mark")用來聲明該文件的編碼信息。

  “utf-8”是以字節為編碼單元,它的字節順序在所有系統中都是一樣的,沒有字節序問題,因此它不需要BOM,所以當用"utf-8"編碼方式讀取帶有BOM的文件時,它會把BOM當做是文件內容來處理, 也就會發生類似上邊的錯誤.

  "uft-8-sig"中sig全拼為 signature 也就是"帶有簽名的utf-8",因此"utf-8-sig"讀取帶有BOM的"utf-8文件時"會把BOM單獨處理,與文本內容隔離開,也是我們期望的結果.
————————————————
  參考文獻:

  https://blog.csdn.net/wozaizhe56/article/details/82048645

  https://blog.csdn.net/vernice/article/details/46873169

  

2)創建數據列的字典,使得數據格式合乎要求。

第一步,讀取文件到一個多行的列表中:

第二步,將這些行分為標題行和數據行:

第三步,用字典構造式和zip(*values),后者將行轉置為列,創建數據列的字典:

注意:上述為標准方法,值得學習模板;

    收集參數 *value的含義,可參考該鏈接復習:https://www.cnblogs.com/ElonJiang/p/11440695.html

    函數zip可用於“縫合”任意數量的序列,可參考鏈接復習:https://www.cnblogs.com/ElonJiang/p/11355846.html

3)CSV文件的形式很多,只需定義 csv.Dialect的一個子類即可定義出新格式(如專門的分隔符、字符串引用約定、行結束符等):

Ps:各個CSV語支的參數也可用關鍵字的形式提供給csv.reader,而無需定義子類:

6.1.4 JSON數據

JSON(JavaScript Object Notation的簡稱),已經成為通過HTTP請求Web瀏覽器其他應用程序之間發送數據的標准格式之一。比表格型文本格式(如CSV)靈活的多。

JSON非常接近於有效的Python代碼。

基本類型有:對象(字典)、數組(列表)、字符串、布爾值以及null。對象中所有鍵都必須是字符串。

使用Python標准庫中的 json模塊 讀寫JSON數據,通過json.loads可將JSON字符串轉換成Python形式。

1)一個JSON數據例子

2)將該JSON數據用 json.loads將其轉換成Python形式

  Ps:json.dumps則是將Python對象轉換成JSON格式

  

3)將JSON對象轉換為DateFrame或Series或其他便於分析的數據結構

方法一(最簡單):向Dateframe構造器傳入一個字典的列表(就是原先的JSON對象),並選取數據字段的子集

  

方法二:用pandas.read_json自動將特別格式的JSON數據集轉換為Series或DataFrame

  

  data = pd.read_json(r"D:\Python\examples\example.json", encoding='utf-8') --報錯!!!???

  Ps:此處一直報錯,ValueError: Unexpected character found when decoding array value (1),嘗試添加encoding=‘utf-8' 無結果

6.1.5 XML和HTML:Web信息收集

Python有許多可讀寫常見HTML和XML格式數據的庫,包括lxml、Beautiful Soup和html5lib。其中,lxml的速度比較快,但是其他庫處理有誤的HTML或XML文件更好。

pandas一個內置功能,read_html,它可使用lxml和Beautiful Soup子集將HTML文件中的表格解析為DataFrame對象。

需安裝read_html用到的庫lxml

示例暫無!!!

 

6.1.6 利用lxml.objectify解析XML

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM