yiskw note

機械学習やプログラミングについて気まぐれで書きます

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が他の方法より数百倍も速くなっています.
これ知らないと,かなり損ですね.勉強になりました.

参考

kunai-lab.hatenablog.jp

大変参考にさせていただきました.