手把手教你使用 Pandas 讀取結構化數據
導讀: Pandas 是一個基於 Numpy 庫開發的更高級的結構化數據分析工具,提供了 Series、DataFrame、Panel 等數據結構,可以很方便地對序列、截面數據(二維表)、面板數據進行處理。
作者:張秋劍 張浩 周大川 常國珍
來源:大數據 DT(ID:hzdashuju)
-
DataFrame 是我們常見的二維數據表,包含多個變量(列)和樣本(行),通常被稱爲數據框。
-
Series 是一個一維結構的序列,包含指定的索引信息,可以被視作 DataFrame 中的一列或一行。其操作方法與 DataFrame 十分相似。
-
Panel 是包含序列及截面信息的三維結構,通常被稱爲面板數據。
我們可通過限定時間 ID 和樣本 ID 獲得對應的 Series 和 DataFrame。
由於這些對象的常用操作方法十分相似,因此本文主要使用 DataFrame 進行演示。
01 讀取文件
Pandas 庫提供了便捷讀取本地結構化數據的方法。這裏主要以 csv 數據爲例,read_csv 函數可以讀取 csv 數據,代碼如下:
import pandas as pd
csv = pd.read_csv('data/sample.csv')
csv
id name scores
0 1 小明 78.0
1 2 小紅 87.0
2 3 小白 99.0
3 4 小青 99999.0
4 5 小蘭 NaN
按照慣例,Pandas 會以 pd 爲別名,以 read_csv 函數讀取指定路徑下的文件,然後返回一個 DataFrame 對象。如果在命令行中打印 DataFrame 對象,可讀性可能會略差一些;如果在 Jupyter Notebook 中打印的話,可讀性會大幅提升。
打印出來的 DataFrame 包含索引(第一列),列名(第一行)及數據內容(除第一行和第一列之外的部分)。
此外,read_csv 函數有很多參數可以設置,如下所示。
-
filepath_or_buffer csv 文件的路徑
-
sep = ',' 分隔符,默認爲逗號
-
header = 0 int 類型,0 代表第一行爲列名,若設定爲 None 將使用數值列名
-
names = [] list,重新定義列名,默認爲 None
-
usecols = [] list,定義讀取的列,設定後將縮短讀取數據的時間,並減小內存消耗,適合讀取大量數據,默認爲 None
-
dtype = {} dict,定義讀取列的數據類型,默認爲 None
-
nrows = None int 類型,指定讀取數據的前 n 行,默認爲 None
-
na_values = ... str 類型,list 或 dict,指定缺失值的填充值
-
na_filter = True bool 類型,自動發現數據中的缺失值,默認值爲 True,若確定數據無缺失,可以設定值爲 False,以提高數據載入的速度
-
chunksize = 1000 int 類型,分塊讀取,當數據量較大時,可以設定分塊讀取的行數,默認爲 None
-
encoding = 'utf-8' str 類型,數據的編碼,Python3 默認編碼爲 UTF-8,Python2 默認編碼爲 ASCII
Pandas 除了可以直接讀取 csv、excel、json、html 等文件生成的 DataFrame,也可以在列表、元組、字典等數據結構中創建 DataFrame。
02 讀取指定行和指定列
使用參數 usecol 和 nrows 讀取指定的列和前 n 行,這樣可以加快數據讀取速度。讀取原數據的兩列、兩行示例如下。
csv = pd.read_csv('data/sample.csv',\
usecols=['id','name'],\
nrows=2) #讀取'id'和'name'兩列,僅讀取前兩行
csv
id name
0 1 小明
1 2 小紅
03 分塊讀取
參數 chunksize 可以指定分塊讀取的行數,並返回一個可迭代對象。這裏,big.csv 是一個 4500 行、4 列的 csv 數據,設定 chunksize=900,分 5 塊讀取數據,每塊 900 行,4 個變量,如下所示:
csvs = pd.read_csv('data/big.csv',chunksize=900)
for i in csvs:
print (i.shape)
(900, 4)
(900, 4)
(900, 4)
(900, 4)
(900, 4)
可以使用 pd.concat 函數讀取全部數據:
csvs = pd.read_csv('data/big.csv',chunksize=900)
dat = pd.concat(csvs,ignore_index=True)
dat.shape
(4500, 4)
04 將不合理數據讀取爲缺失值
在數據 sample.csv 中,“小青” 的分數中有的取值爲 99999,這裏令其讀取爲缺失值,操作如下:
csv = pd.read_csv('data/sample.csv',
na_values='99999')
csv
id name scores
0 1 小明 78.0
1 2 小紅 87.0
2 3 小白 99.0
3 4 小青 NaN
4 5 小蘭 NaN
05 以指定編碼方式讀取
讀取數據時,亂碼情況經常出現。這裏需要先弄清楚原始數據的編碼形式,再以指定的編碼形式讀取,例如 sample.csv 編碼爲 UTF-8,這裏以指定編碼(參數 encoding)方式讀取。
csv = pd.read_csv('data/sample.csv',
encoding='utf-8')
csv
id name scores
0 1 小明 78.0
1 2 小紅 87.0
2 3 小白 99.0
3 4 小青 99999.0
4 5 小蘭 NaN
關於作者: 張秋劍,就職於騰訊雲金融拓展中心,從事微信財富營銷管理、數據中臺、AI 應用等解決方案拓展工作,研究方向包括數字化轉型、創新實踐等。
張浩,曾任騰訊雲金融首席架構師和星環科技金融行業技術總監,主要從事大數據、人工智能、雲計算、區塊鏈、聯邦學習等相關技術研發與產品設計,具有豐富的企業架構設計、企業數字化戰略轉型運營與業務諮詢經驗。
周大川,就職於某中央金融企業金融科技研發中心,主要從事企業級數據平臺開發、核心業務平臺建設、AI 賦能金融科技創新等工作,具有豐富的新一代金融業務系統建設經驗。
常國珍,曾任畢馬威諮詢大數據總監,具有近 20 年數據挖掘、精益數據治理、數字化運營諮詢經驗,是金融信用風險、反欺詐和反洗錢算法領域的專家。
本文摘編自《金融商業數據分析:基於 Python 和 SAS》,經出版方授權發佈。(ISBN:9787111695837)
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/fS87lLQL8Rt_FRD-enYpTg