[英]Pandas : Manage big csv files: group + sort in new files?
我有一個非常大的 csv 文件需要管理,這個過程是:
這是我的第一次嘗試:
file = pd.read_csv('file.csv')
grouped = file.groupby([col1, col2, col3])
for key, df in grouped:
name = 'key.csv'
df = df.sort_values(by=[col4, col5, col6, col7, col8])
df.to_csv(name , index=False)
yield name
這種方法的優點:我可以在每次迭代時生成文件名,然后繼續我的文件 ETL 過程,而無需等待另一個准備就緒,然后在編寫 csv 之前直接對數據幀進行排序。
壞點:文件太大而無法那樣處理,我有內存錯誤。
所以我的第二次(和當前)嘗試:
list_files = []
for chunk in pd.read_csv('file.csv', chunksize=CHUNKSIZE):
grouped = chunk.groupby([col1, col2, col3])
for key, df in grouped:
name = 'key.csv'
if Path(name).exists():
df.to_csv(name, index=False, header=False, mode='a')
else:
list_files.append(name)
df.to_csv(name, index=False)
yield list_files
這里:沒有內存問題,因為我用塊讀取了文件。
但是,正如您所看到的,因為如果文件退出,我會將數據附加到文件中,所以數據沒有排序。 所以我需要生成所有文件的列表,並創建第二個函數來做到這一點:
def sort(list_files):
for filename in list_files:
df = pd.read_csv(filename)
df = df.sort_value(..)
df.to_csv(filename)
yield filename
所以我需要再次讀取每個文件,這里的過程需要在傳遞到 ETL 過程的下一步之前創建所有 list_files
關於這個,你知道有沒有辦法(我目前沒有看到),來解決內存錯誤的問題,並以更快的方式進行這個分組/排序過程? 也許(當然)這是不可能的,但任何改進都會有所幫助(以更智能的方式將數據附加到文件中,然后數據可能已經排序?)
謝謝
編輯:也許一種方法可能是在讀取大文件之前對其進行排序,但是我會再次遇到內存問題,不知道除了熊貓之外是否還有其他方法會更好?
Dask實現了pandas的大部分功能,不會出現MemoryError(顯然性能不會那么出色)。 類似情況: 從延遲集合創建大型 dask.dataframe 時出現 Killed/MemoryError
我去過那里,我建議你使用 Dask,它為分析提供了高級並行性https://dask.org/有點類似於 Spark 所做的。 然后您可以使用與第一次嘗試相同的代碼
import dask.dataframe as dd
file = dd.read_csv('file.csv')
grouped = file.groupby([col1, col2, col3])
for key, df in grouped:
name = 'key.csv'
df = df.sort_values(by=[col4, col5, col6, col7, col8])
df.to_csv(name , index=False)
yield name
PS:如果在將文件保存到 csv 時出現內存錯誤,請使用 to_csv 函數中的選項 chunksize
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.