[英]How to concat thousands of pandas dataframes generated by a for loop efficiently?
[英]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).
我需要:
目前這就是我正在做的事情:
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.