數(shù)據(jù)幀的塊讀取和寫入
分塊,正如其名所示,意味著以,嗯,塊的形式處理文件。你按部分讀?。ɑ?qū)懭耄┪募?。如果你使?Zarr(見第 8.4 節(jié))或 Dask(見第十章),你肯定會(huì)處理分塊。
在這里,我們將回到我們信任的出租車示例。我們將以塊的形式將文件從 CSV 轉(zhuǎn)換為 Parquet,盡管文件足夠小,在大多數(shù)計(jì)算機(jī)上我們可以在內(nèi)存中完成這個(gè)操作,但讓我們假設(shè)我們在一個(gè)內(nèi)存受限的機(jī)器上,并且無法在內(nèi)存中加載整個(gè)文件。
我們將使用 pandas 讀取 CSV 文件,并使用 Arrow 寫入 Parquet 版本。我們可以用 Arrow 完成所有操作,這將更高效,但我們想展示 pandas 分塊接口
① 類型將是 pandas.io.parsers.TextFileReader。
② 每個(gè)塊將是一個(gè)數(shù)據(jù)幀。
我們只需要將 chunksize 參數(shù)添加到 read_csv 中。你將不會(huì)從 read_csv 獲得一個(gè)數(shù)據(jù)幀,而是一個(gè)塊生成器。然后每個(gè)塊將是一個(gè)數(shù)據(jù)幀,最大行數(shù)為 100 萬行。
我們現(xiàn)在將進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換。首先,我們需要重新打開文件。我們已經(jīng)遍歷了所有塊一次,所以我們需要回到開始
我們還需要指定一些列的數(shù)據(jù)類型;某些列的類型可能會(huì)從一塊數(shù)據(jù)變化到另一塊數(shù)據(jù)。這種情況在整數(shù)列中尤為常見,尤其是那些包含空值的列。當(dāng)存在空值時(shí),類型會(huì)被提升為float,因?yàn)樵?pandas 中無法用整數(shù)來表示空值。