Pandas庫 | 高速讀取csv文件的方法
↑?關(guān)注 + 星標(biāo)?,每天學(xué)Python新技能
后臺回復(fù)【大禮包】送你Python自學(xué)大禮包
問題場景
當(dāng)遇到特別大的csv文件,例如500M,pandas讀取會很慢,在之前教程中要使用其他包另類的語法。現(xiàn)在只需更新pandas,加一個(gè)參數(shù)即可。
在本文中,我們將介紹:
Pandas 的默認(rèn) CSV讀數(shù)據(jù), v1.4 中引入的更快、更并行的 CSV解析器。 一種不同的方法可以使事情變得更快。 讀取 CSV,默認(rèn)方式
碰巧有一個(gè) 850MB 的 CSV 文件,這是使用 Pandas 加載它的默認(rèn)方式:
##?更新pandas
!pip3?install?--upgrade?pandas
import?pandas?as?pd
df?=?pd.read_csv("large.csv")
下面是舊的pandas版本代碼讀數(shù)據(jù)所消耗時(shí)間
0m13.245s
使用pyarrow讀csv
2022年1月份,剛剛發(fā)布的pandas1.4版本增加了arrow庫的csv解析器。對了,該功能仍然處于試驗(yàn)階段,不是默認(rèn)解析器,但是足夠快。下面是新版本用法
import?pandas?as?pd
df?=?pd.read_csv("large.csv",?engine="pyarrow")
新版本代碼讀數(shù)據(jù)所消耗時(shí)間
0m6.507s
| CSV解析器 | CPU運(yùn)行時(shí)間 |
|---|---|
| 默認(rèn)C | 13.2s |
| PyArrow | 6.5s |
需要注意,如果你的數(shù)據(jù)分析項(xiàng)目已經(jīng)使用了并行加速數(shù)據(jù)的讀取,那么今天的新教程(pyarrow)并不會特別顯著改善代碼運(yùn)行速度(十幾倍加速),但至少可能提供有意義的加速(一倍左右)。
重新思考
加載 CSV 基本上是一項(xiàng)繁重的工作:
需要分成幾行。 需要用逗號分隔每一行。 需要處理字符串引用。 需要猜測(!)列的類型,除非您明確地將它們傳遞給 Pandas。 需要將字符串轉(zhuǎn)換為整數(shù)、日期和其他非字符串類型。
所有這些都需要 CPU 時(shí)間。
如果您從第三方獲取 CSV,并且只處理一次,那么您對此無能為力。但是,如果您多次加載同一個(gè) CSV 文件怎么辦?或者,如果您是在數(shù)據(jù)處理管道的其他部分生成輸入文件的人,該怎么辦?
您可以讀取其他一些處理速度更快的文件格式,而不是讀取 CSV。讓我們看一個(gè)例子,使用 Parquet 數(shù)據(jù)格式。Parquet 文件旨在快速讀取:您不必像使用 CSV 那樣進(jìn)行大量解析。與 CSV 不同,其中列類型在文件讀取時(shí)無需編碼,在 Parquet 中,列的類型存儲在實(shí)際文件中。
首先,我們將 CSV 文件轉(zhuǎn)換為 Parquet 文件;我們禁用壓縮,因此我們正在與 CSV 進(jìn)行更多的蘋果對蘋果的比較。當(dāng)然,如果您是第一個(gè)生成文件的人,則不需要轉(zhuǎn)換步驟,您可以直接將數(shù)據(jù)寫入 Parquet。
import?pandas?as?pd
df?=?pd.read_csv("large.csv")
df.to_parquet("large.parquet",?compression=None)
現(xiàn)在我們的數(shù)據(jù)存在于large.parquet中,再讀取large.parquet看看讀取時(shí)間
import?pandas?as?pd
df?=?pd.read_parquet("large.parquet",?engine="fastparquet")
2.441s
| CSV解析器 | CPU運(yùn)行時(shí)間 |
|---|---|
| 默認(rèn)C | 13.2s |
| PyArrow | 6.5s |
| fastparquet | 2.4s |
純粹由 CPU 衡量,fastparquet 是迄今為止最快的。?這只是一個(gè)例子。但顯然閱讀 Parquet 格式的效率要高得多。
最好的文件格式不是 CSV
CSV 是一種糟糕的格式。除了解析效率低下之外,缺少類型數(shù)據(jù)意味著解析總是比具有實(shí)際列類型的結(jié)構(gòu)化文件格式更容易出錯(cuò)和模棱兩可。因此,如果可以,請避免使用 CSV 并使用更好的格式,盡量選擇其他高效類型,如 Parquet。
如果你被 CSV 卡住了,考慮在 Pandas 1.4 中使用新的 PyArrow CSV 解析器;你會得到很好的加速,特別是如果你的程序當(dāng)前沒有利用多個(gè) CPU。
