簡體   English   中英

如何有效地連接數千個 Pandas DataFrames?

[英]How to concatenate thousands of Pandas DataFrames efficiently?

我有一個文件夾/data/csvs ,其中包含 ~7000 個 CSV 文件,每個文件有 ~600 行。 Each CSV has a name which contains a timestamp that needs to be preserved eg /data/csvs/261121.csv , /data/csvs/261122.csv ( 261121 being 26/11/21 today's date).

我需要:

  1. 加載每個 CSV。
  2. 添加一個可以保存時間戳的列,以便我知道數據來自哪個文件。 時間每行增加半秒,因此該行還顯示小時/分鍾/秒/微秒。
  3. 將這些行合並到一個表中,該表將跨越一個月的數據。
  4. 理想情況下,我希望最終產品是 DataFrame。

目前這就是我正在做的事情:

    files = os.listdir('/data/csvs')
    csv_names = []
    for file_name in files:
        if file_name[-4:] == '.csv':
            csv_names.append(file_name)

    to_process = len(csv_names)
    for i, csv_name in enumerate(csv_names):
        df = pd.read_csv(f'{csv_folder_path}/{file_name}')
        df = timestamp(df, csv_name)

        to_process = to_process-1

        if i == 0:
            concat_df = df
            concat_df.to_feather(path=processed_path)
        else:
            concat_df = pd.concat([concat_df, df])

            if to_process % 100 == 0:
                saved_df = pd.read_feather(path=processed_path)
                concat_df = pd.concat([saved_df, concat_df])
                concat_df.reset_index(drop=True, inplace=True)
                concat_df.to_feather(path=processed_path)

I'm loading in each CSV as a DataFrame, adding the timestamp column and concatenating the CSVs 100 at a time (because I thought this would reduce memory usage) and then saving 100 CSVs at a time to a large DataFrame feather file. 這真的很慢,並且使用了大量的 memory。

有什么更有效的方法來做到這一點?

首先,您可以更有效地使用glob加載文件。 這樣可以節省您遍歷所有文件並檢查文件擴展名是否為“.csv”

import glob

src = '/data/csvs'
files = glob.iglob(os.path.join(src, "*.csv"))

然后,將所有文件讀入 df 並將它們添加到生成器中,在同一步驟中將文件的基本名稱分配給名為 timestamp 的列

df_from_each_file = (pd.read_csv(f).assign(timestamp=os.path.basename(f).split('.')[0]) for f in files)

最后將 dfs 連接成一個

csv_data = pd.concat(df_from_each_file, ignore_index=True)

希望這有幫助。 我已經對大量數據使用了這樣的過程,並且發現它足夠有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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