點擊上方「中興開發者社區」,關注我們
每天讀一篇一線開發者原創好文
作者介紹:
作者劉曉波是開源軟體愛好者,致力於DPI領域和機器學習的落地應用。這篇文章介紹了利用數據分析工具pandas讀取csv文件的方法和注意點,便於迅速過渡到數據處理階段。
pandas是一個高效的數據分析工具。基於其高度抽象的數據結構DataFrame,幾乎可以對數據進行任何你想要的操作。
由於現實世界中數據源的格式非常多,pandas也支持了不同數據格式的導入方法,本文介紹pandas如何從csv文件中導入數據。
從上圖可以看出,我們要做的工作就是把存儲在csv格式中的數據讀入並轉換成DataFrame格式。
pandas提供了一個非常簡單的api函數來實現這個功能:read_csv()。
下面是一個簡單的示例:
import pandas as pd
CSV_FILE_PATH = './test.csv'
df = pd.read_csv(CSV_FILE_PATH)
print(df.head(5))
只要簡單地指定csv文件的路徑,便可以得到DataFrame格式的數據df。對於理想情況下的數據,導入過程就是這麼簡單!
下面考慮這種情況:假設csv文件頭部有幾個無效行,那麼列印出來的結果可能如下所示:
1 2 3 4
0 datetime host hit volume
1 2018-07-24 09:00:00 weibo.com 20 1020
2 2018-07-25 09:00:00 qq.com no 20 1028
3 2018-07-26 19:00:00 sina.com 25 1181
4 2018-07-27 21:00:00 sohu.com 15 4582
pandas把【1,2,3,4】這組無效數據當作了column name;而實際上,我們更偏向於將【datetime,host,hit,volume】這組數據當作column name。對於這種情況,read_csv()函數提供了一個參數:skiprows,用於指定跳過csv文件的頭部的前幾行。在這裡,我們跳過1行即可。
import pandas as pd
CSV_FILE_PATH = './test.csv'
df = pd.read_csv(CSV_FILE_PATH, skiprows=1)
print(df.head(5))
得到的結果如下所示:
datetime host hit volume
0 2018-07-24 09:00:00 weibo.com 20 1020
1 2018-07-25 09:00:00 qq.com no 20 1028
2 2018-07-26 19:00:00 sina.com 25 1181
3 2018-07-27 21:00:00 sohu.com 15 4582
2. 處理csv文件中的無效數據pandas可以自動推斷每個column的數據類型,以方便後續對數據的處理。還以上文中的數據為例,通過如下代碼:
import pandas as pd
CSV_FILE_PATH = './test.csv'
df = pd.read_csv(CSV_FILE_PATH)
print(df.head(5))
print('datatype of column hit is: ' + str(df['hit'].dtypes))
得出的結果:
datetime host hit volume
0 2018-07-24 09:00:00 weibo.com 20 1020
1 2018-07-25 09:00:00 qq.com 20 1028
2 2018-07-26 19:00:00 sina.com 25 1181
3 2018-07-27 21:00:00 sohu.com 15 4582
datatype of column hit is: int64
pandas將hit這一列的數據類型判定為了int64,這顯然方便未來我們對於該列數據的運算。
但是在實際情況中,我們經常會面臨數據缺失的問題,如果出現這種情況,我們往往會用一些佔位符來表達。假設,我們用missing這個佔位符來表示數據缺失,仍使用上述代碼,來探索下會發生些什麼:
datetime host hit volume
0 2018-07-24 09:00:00 weibo.com 20 1020
1 2018-07-25 09:00:00 qq.com 20 1028
2 2018-07-26 19:00:00 sina.com missing missing
3 2018-07-27 21:00:00 sohu.com 15 4582
datatype of column hit is: object
由於hit這一列中出現了missing這個字符串,pandas將hit這一列的數據類型判斷成了object。這會給我們對該列數據的運算帶來影響。例如,假設我們要計算hit列前兩行數據的和,代碼如下:
print(df['hit'][0] + df['hit'][1])
結果是:
2020
本來我們想要的是數學運算結果,但得到的卻是一個字符串拼接結果。這就是由於數據類型判斷失誤帶來的嚴重影響。
對於這種情況,read_csv()函數也提供了一個簡單的處理方式,只需要通過na_value參數指定佔位符,pandas便會在讀入數據的過程中自動將這些佔位符轉換成NaN,從而不影響pandas對column數據類型的正確判斷。
示例代碼:
import pandas as pd
CSV_FILE_PATH = './test.csv'
df = pd.read_csv(CSV_FILE_PATH, skiprows=0, na_values=['missing')
print(df.head(5))
print('datatype of column hit is: ' + str(df['hit'].dtypes))
print(df['hit'][0] + df['hit'][1])
運行結果如下:
datetime host hit volume
0 2018-07-24 09:00:00 weibo.com 20.0 1020.0
1 2018-07-25 09:00:00 qq.com 20.0 1028.0
2 2018-07-26 19:00:00 sina.com NaN NaN
3 2018-07-27 21:00:00 sohu.com 15.0 4582.0
datatype of column hit is: float64
40.0
可以看到,pandas將數據集中的missing單元全部轉換為了NaN,並成功判斷出hit這一列的數據類型。
通過一個簡單的read_csv()函數,實際可以做到如下幾件事:
當然,read_csv()函數還有一系列其他參數來應對各種情況,遇到具體問題的同學可參考其接口指南。