PandasのDataFrameのappendの高速化

pandas.DataFrame.appendがかなり遅いときの対策メモ

タスク

空のDataFrameに大量のDataFrame(or Series)を付け加える.

今回は例として,以下の空のdf_dataに(2×3の)df_addを1万個付け加える.(本当はdf_addは毎回違うデータと思うが今回は例なので同じものを付け加える想定)

1
2
3
4
5
6
import pandas as pd
df = pd.DataFrame()
df_add = pd.DataFrame([[1, 2, 3], [4, 5, 6]])

# タスク
# dfにdf_addを1万回くっつける

1. DataFrame.appendによる実現(遅い)

1
2
3
4
5
df = pd.DataFrame()
df_add = pd.DataFrame([[1, 2, 3], [4, 5, 6]])

for i in range(10000):
df = df.append(df_add, ignore_index=True)

これは結構時間がかかる.(dfが毎回コピーされるため?)

2. DataFrame.from_dictによる実現(速い)

1
2
3
4
5
6
7
8
9
10
11
df = pd.DataFrame()
df_add = pd.DataFrame([[1, 2, 3], [4, 5, 6]])

counter = 0
dict_tmp = {}

for i in range(10000):
for _, row in df_add.iteritems():
dict_tmp[counter] = row
counter += 1
df = df.from_dict(dict_tmp, orient="index")

空の辞書を作ってあげて,そこにkey=counterとしてpandas.Seriesを追加していく.最後にpandas.DataFrame.from_dictによって辞書からDataFrameを作る.
動かしてみたらわかるがこちらのほうがだいぶ速い.

!!! Tip
今回はdf_addSeriesにするためにiteritems()を使っている.

参考リンク