LoginSignup
4
3

More than 3 years have passed since last update.

複数のCSV、データフレームを1つのデータフレームに高速にまとめる【60倍速】

Last updated at Posted at 2020-09-19

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をまとめるという作業はよく発生するものでしたので、非常に役立っています。
データフレームのリストを作るだけで使えますので、汎用性も高いです!

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3