【问题标题】:How to concatenate thousands of Pandas DataFrames efficiently?如何有效地连接数千个 Pandas DataFrame?
【发布时间】:2022-01-04 14:53:48
【问题描述】:

我有一个文件夹 /data/csvs,其中包含 ~7000 个 CSV 文件,每个文件有 ~600 行。每个 CSV 都有一个名称,其中包含需要保留的时间戳,例如/data/csvs/261121.csv/data/csvs/261122.csv261121 是今天的 26/11/21)。

我需要:

  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)

我将每个 CSV 作为 DataFrame 加载,添加时间戳列并一次连接 100 个 CSV(因为我认为这会减少内存使用量),然后一次将 100 个 CSV 保存到一个大型 DataFrame 羽化文件.这真的很慢,而且会占用大量内存。

什么是更有效的方法?

【问题讨论】:

    标签: python pandas dataframe csv


    【解决方案1】:

    首先,您可以使用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)
    

    希望这有帮助!我已经对大量数据使用了这样的过程,并且发现它足够高效。

    【讨论】:

    • 这很好用,谢谢。
    猜你喜欢
    • 2021-04-22
    • 2013-09-09
    • 2019-03-22
    • 1970-01-01
    • 2018-11-30
    • 2020-05-14
    • 2019-08-17
    • 2020-09-06
    • 2020-01-21
    相关资源
    最近更新 更多