pandas.DataFrameのfor文を高速化する
概要
最近数百万オーダーのテーブルデータを扱うことがあり,そのデータを読み込んだpandas.DataFrameをfor文で処理が非常に遅く,困っておりました.
そこで,pandas.DataFrameのfor文を高速化する方法について調べたので,こちらにメモしておきます.
高速化する方法
df = pd.DataFrame({"data": list(range(3000000))}) n = len(df) data = df.data.values for i in range(n): # 何らかの処理 data[i]
実験
3通りの方法で各レコードにfor文でアクセスしてみました. 5回の平均の処理時間を比べてみます.
import time import pandas as pd df = pd.DataFrame({"data": list(range(100000))}) # 方法1 time1 = 0.0 for _ in range(5): start = time.time() for i, row in df.iterrows(): row.data time1 += time.time() - start time1 /= 5 # 方法2 time2 = 0 for _ in range(5): start = time.time() for i in range(len(df)): df.iloc[i]["data"] time2 += time.time() - start time2 /= 5 # 方法3 time3 = 0.0 for _ in range(5): start = time.time() data = df.data.values for i in range(len(df)): data[i] time3 += time.time() - start time3 /= 5 print(f"方法1: {time1} 秒") print(f"方法2: {time2} 秒") print(f"方法3: {time3} 秒")
結果
方法1: 6.756291007995605 秒 方法2: 8.100687980651855 秒 方法3: 0.018123054504394533 秒
方法3が他の方法より数百倍も速くなっています.
これ知らないと,かなり損ですね.勉強になりました.
参考
大変参考にさせていただきました.