這篇文章介紹了利用數(shù)據(jù)分析工具pandas讀取csv文件的方法和注意點(diǎn),便于迅速過渡到數(shù)據(jù)處理階段。
pandas是一個(gè)高效的數(shù)據(jù)分析工具。基于其高度抽象的數(shù)據(jù)結(jié)構(gòu)DataFrame,幾乎可以對(duì)數(shù)據(jù)進(jìn)行任何你想要的操作。
由于現(xiàn)實(shí)世界中數(shù)據(jù)源的格式非常多,pandas也支持了不同數(shù)據(jù)格式的導(dǎo)入方法,本文介紹pandas如何從csv文件中導(dǎo)入數(shù)據(jù)。
從上圖可以看出,我們要做的工作就是把存儲(chǔ)在csv格式中的數(shù)據(jù)讀入并轉(zhuǎn)換成DataFrame格式。pandas提供了一個(gè)非常簡單的api函數(shù)來實(shí)現(xiàn)這個(gè)功能:read_csv()。
1. 通過read_csv接口讀入csv文件中的數(shù)據(jù)
下面是一個(gè)簡單的示例:
import pandas as pd
CSV_FILE_PATH ='./test.csv'
df = pd.read_csv(CSV_FILE_PATH)
print(df.head(5))
只要簡單地指定csv文件的路徑,便可以得到DataFrame格式的數(shù)據(jù)df。對(duì)于理想情況下的數(shù)據(jù),導(dǎo)入過程就是這么簡單!
下面考慮這種情況:假設(shè)csv文件頭部有幾個(gè)無效行,那么打印出來的結(jié)果可能如下所示:
1 2 3 4
0 datetime host hit volume
12018-07-2409:00:00 weibo.com 20 1020
22018-07-2509:00:00 qq.com no20 1028
32018-07-2619:00:00 sina.com 25 1181
42018-07-2721:00:00 sohu.com 15 4582
pandas把【1,2,3,4】這組無效數(shù)據(jù)當(dāng)作了column name;而實(shí)際上,我們更偏向于將【datetime,host,hit,volume】這組數(shù)據(jù)當(dāng)作column name。對(duì)于這種情況,read_csv()函數(shù)提供了一個(gè)參數(shù):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))
得到的結(jié)果如下所示:
datetime host hit volume
02018-07-2409:00:00 weibo.com 20 1020
12018-07-2509:00:00 qq.com no20 1028
22018-07-2619:00:00 sina.com 25 1181
32018-07-2721:00:00 sohu.com 15 4582
2. 處理csv文件中的無效數(shù)據(jù)
pandas可以自動(dòng)推斷每個(gè)column的數(shù)據(jù)類型,以方便后續(xù)對(duì)數(shù)據(jù)的處理。還以上文中的數(shù)據(jù)為例,通過如下代碼:
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))
得出的結(jié)果:
datetime host hit volume
02018-07-2409:00:00 weibo.com 20 1020
12018-07-2509:00:00 qq.com 20 1028
22018-07-2619:00:00 sina.com 25 1181
32018-07-2721:00:00 sohu.com 15 4582
datatype of column hit is: int64
pandas將hit這一列的數(shù)據(jù)類型判定為了int64,這顯然方便未來我們對(duì)于該列數(shù)據(jù)的運(yùn)算。但是在實(shí)際情況中,我們經(jīng)常會(huì)面臨數(shù)據(jù)缺失的問題,如果出現(xiàn)這種情況,我們往往會(huì)用一些占位符來表達(dá)。假設(shè),我們用missing這個(gè)占位符來表示數(shù)據(jù)缺失,仍使用上述代碼,來探索下會(huì)發(fā)生些什么:
datetime host hit volume
02018-07-2409:00:00 weibo.com 20 1020
12018-07-2509:00:00 qq.com 20 1028
22018-07-2619:00:00 sina.com missing missing
32018-07-2721:00:00 sohu.com 15 4582
datatype of column hit is:object
由于hit這一列中出現(xiàn)了missing這個(gè)字符串,pandas將hit這一列的數(shù)據(jù)類型判斷成了object。這會(huì)給我們對(duì)該列數(shù)據(jù)的運(yùn)算帶來影響。例如,假設(shè)我們要計(jì)算hit列前兩行數(shù)據(jù)的和,代碼如下:
print(df['hit'][0]+ df['hit'][1])
結(jié)果是:
2020
本來我們想要的是數(shù)學(xué)運(yùn)算結(jié)果,但得到的卻是一個(gè)字符串拼接結(jié)果。這就是由于數(shù)據(jù)類型判斷失誤帶來的嚴(yán)重影響。對(duì)于這種情況,read_csv()函數(shù)也提供了一個(gè)簡單的處理方式,只需要通過na_value參數(shù)指定占位符,pandas便會(huì)在讀入數(shù)據(jù)的過程中自動(dòng)將這些占位符轉(zhuǎn)換成NaN,從而不影響pandas對(duì)column數(shù)據(jù)類型的正確判斷。示例代碼:
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])
運(yùn)行結(jié)果如下:
datetime host hit volume
02018-07-2409:00:00 weibo.com 20.01020.0
12018-07-2509:00:00 qq.com 20.01028.0
22018-07-2619:00:00 sina.com NaN NaN
32018-07-2721:00:00 sohu.com 15.04582.0
datatype of column hit is: float64
40.0
可以看到,pandas將數(shù)據(jù)集中的missing單元全部轉(zhuǎn)換為了NaN,并成功判斷出hit這一列的數(shù)據(jù)類型。
3. 總結(jié)
通過一個(gè)簡單的read_csv()函數(shù),實(shí)際可以做到如下幾件事:
通過指定的文件路徑,從本地讀取csv文件,并將數(shù)據(jù)轉(zhuǎn)換成DataFrame格式
更正數(shù)據(jù)集的頭部(column)
正確處理缺失數(shù)據(jù)
推斷每一列的數(shù)據(jù)類型
當(dāng)然,read_csv()函數(shù)還有一系列其他參數(shù)來應(yīng)對(duì)各種情況,遇到具體問題的同學(xué)可參考其接口指南。
-
數(shù)據(jù)處理
+關(guān)注
關(guān)注
0文章
607瀏覽量
28597 -
數(shù)據(jù)分析
+關(guān)注
關(guān)注
2文章
1453瀏覽量
34090 -
csv
+關(guān)注
關(guān)注
0文章
39瀏覽量
5832
原文標(biāo)題:干貨 | pandas讀取csv文件數(shù)據(jù)的方法及注意點(diǎn)
文章出處:【微信號(hào):ZTEdeveloper,微信公眾號(hào):中興開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論