簡體   English   中英

Pandas:管理大 csv 文件:對新文件進行分組 + 排序?

[英]Pandas : Manage big csv files: group + sort in new files?

我有一個非常大的 csv 文件需要管理,這個過程是:

  • 將文件按 3 列分組
  • 對於每組,對 5 列的數據框進行排序
  • 將此數據框寫入 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM