我正在處理一些CSV檔案,其大小在1Gb到2Gb之間。僅僅將檔案加載到pandas資料框架中就需要20-30分鐘,而我進行的每項操作,例如通過列名過濾資料框架、列印dataframe.head()等,都需要20-30分鐘。有時,當我在等待時試圖使用另一個應用程式時,它也會使我的計算機滯后。我使用的是2019年的Macbook Pro,但我想其他設備也會有同樣的問題。
我已經嘗試使用modin,但資料操作仍然非常緩慢。
有什么方法可以讓我更有效地作業嗎?
預先感謝您的答復。
uj5u.com熱心網友回復:
關于擴展到大型資料集的pandas檔案有一些很好的提示,我在這里總結一下:
usecols或nrows 引數到pd.read_csv,讀入一個列或行的子集。例如,如果你的資料有很多列,但你只需要col1和col2列,使用pd.read_csv(filepath, usecols=['col1', 'col2'])/code>。如果你正在加載帶有大量額外逗號的資料集(例如,行看起來像index,col1,col2,,,,,,,,,,,),這可能特別重要。在這種情況下,使用nrows只讀入資料的一個子集,以確保結果只包括你需要的列。
使用高效資料型別。默認情況下,pandas將所有整數資料存盤為有符號的64位整數,將浮點數存盤為64位浮點數,將字串存盤為物件或字串型別(取決于版本)。你可以使用諸如Series.astype或pd.to_numeric等工具將這些資料轉換為更小的資料型別,并使用downcast 選項。
使用 Chunking。決議巨大的資料塊可能會很慢,特別是如果你的計劃是按行操作,然后將其寫出來,或者將資料切割成一個較小的最終形式。另外,使用low_memory標志,讓Pandas在后端使用分塊迭代器,但回傳單個資料幀。
使用其他庫。這里列出了幾個很好的庫,但我要特別提到dask.dataframe,它專門針對您的用例,實作了CSV檔案的分塊、多核處理,反映了pandas API,并且在處理資料后有簡單的方法將資料轉換回普通的pandas資料框架(如果需要)。
此外,我認為您還應該考慮一些針對 csv 的事情:
指定列資料型別。特別是在分塊的情況下,但即使你不是,指定列的型別可以大大減少讀取時間和記憶體的使用,并突出你的資料中的問題區域(例如,NaN指標或不符合pandas的默認值的Flags)。使用dtypes引數,用一個單一的資料型別來適用于所有的列,或者用一個列名的dict,資料型別對來指示要讀入的型別。你可以選擇提供converters來格式化日期、時間或其他數字資料,如果它不是pandas所識別的格式。
指定決議器引擎 - pandas 可以用純 python(慢)或 C(快得多)讀取 csvs。python引擎的功能稍多一些(例如,目前它不能讀取帶有復雜的多字符定界符的檔案,也不能跳過頁腳)。試著使用引數engine='c'來確保使用的是C引擎。如果你需要一個不支持的檔案型別,我會嘗試先手動修復該檔案(例如,剝離一個頁腳),然后用C引擎決議,如果可能的話。
確保你在數字列中捕獲所有的NaN和資料標志。這可能是一個棘手的問題,在你的輸入中指定特定的資料型別可能有助于捕獲壞情況。使用na_values、keep_default_na、date_parser和converters引數s來pd.read_csv。目前,被解釋為NaN的默認值串列是['', '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN', '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A', 'NULL', 'NaN', 'n/a', 'nan', 'null']/code>。 例如,如果你的數字列的非數字值被編碼為notANumber,那么這將被遺漏,并且會導致一個錯誤(如果你指定了dtypes),或者會導致pandas將整個列重新歸類為一個物件列(對記憶體和速度來說超級糟糕!)。
一遍又一遍地閱讀pd.read_csv檔案。 read_csv 的許多引數都有重要的性能考慮。pd.read_csv被優化為平滑地處理大量可被視為csv的變化,pandas需要準備執行的魔法越多(確定型別、解釋nans、轉換日期(也許)、跳過頭/腳、推斷索引/列、處理壞行等等),讀取速度就越慢。盡可能多地給它一些提示/約束,你可能會看到性能提高很多 如果這還不夠,許多這些調整也將適用于dask.dataframe API,因此這將進一步很好地擴大規模。
uj5u.com熱心網友回復:
這可能對你有幫助,也可能沒有幫助,但是我發現將資料存盤在HDF檔案中,大大改善了IO速度。如果你最終是CSV檔案的來源,我想你應該嘗試把它們存盤為HDF檔案。否則,邁克爾已經說過的可能是要走的路。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/310246.html
標籤:
