df.append()は遅い。。。
データフレームを結合するのにこれまで時間をかけていたのですが、いい方法がありましたので紹介させていただきます。
私の環境では60倍以上の高速に成功しました!
同じ形式のCSVファイルを結合して、読み込むのに利用可能です。
環境
Python: 3.7.6
pandas: 1.0.1
私が使っていた方法
CSVを読みこんで、ひたすらAppendする方法を使っていました。
約2500個のCSV(それぞれおよそ1000行)を読み込み、結合するのに12分42秒かかりました。
csvs = glob.glob('./data/csv/*.csv')
df = pd.DataFrame()
for csv in csvs:
df = df.append(pd.read_csv(csv))
高速な方法
同じCSVの読み込み・結合を11.6秒で完了することができました。
65.6倍速で同じ作業を完了することができました!
from itertools import chain
def fast_concat(dfs):
def fast_flatten(input_list):
return list(chain.from_iterable(input_list))
col_names = dfs[0].columns
df_dict = dict.fromkeys(col_names, [])
for col in col_names:
extracted = (d[col] for d in dfs)
df_dict[col] = fast_flatten(extracted)
df = pd.DataFrame.from_dict(df_dict)[col_names]
return df
dfs = []
for csv in csvs:
dfs += [pd.read_csv(csv)]
df = fast_concat(dfs)
なぜ速いのか
一言でいうとDictに
https://qiita.com/siruku6/items/4846431198769b38bb41
最後に
この記事はこちらの投稿を元に作成しています。
CSVをまとめるという作業はよく発生するものでしたので、非常に役立っています。
データフレームのリストを作るだけで使えますので、汎用性も高いです!