pandas是一個高效的數據分析工具。基于其高度抽象的數據結構DataFrame
(點擊這里了解DataFrame數據結構),幾乎可以對數據進行任何你想要的操作。
由于現實世界中數據源的格式非常多,pandas也支持了不同數據格式的導入方法,本文介紹pandas如何從csv文件中導入數據。
從上圖可以看出,我們要做的工作就是把存儲在csv格式中的數據讀入并轉換成
DataFrame
格式。pandas提供了一個非常簡單的api函數來實現這個功能:
read_csv()
。
1. 通過read_csv接口讀入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
這一列的數據類型。
3. 總結
通過一個簡單的read_csv()
函數,實際可以做到如下幾件事:
- 通過指定的文件路徑,從本地讀取csv文件,并將數據轉換成
DataFrame
格式 - 更正數據集的頭部(column)
- 正確處理缺失數據
- 推斷每一列的數據類型
當然,read_csv()
函數還有一系列其他參數來應對各種情況,遇到具體問題的同學可參考其接口指南。