queryとbool型のSeries指定によるDataFrameのからのデータ抽出速度の差【pandas】

pandasで条件を指定して抽出を行うとき、df[df['Age'] < n]df.query('Age < @n') で同じことができるけれど、 どれくらい実行時間に差があるか気になったので調べた。

使用データ

使ったデータ: 2000行弱のデータ。 Colon function | R Documentation

import pandas as pd
df = pd.read_csv('colon.csv', index_col=0)
df.loc[0:3, ['id', 'study', 'rx', 'sex', 'age']]
id study rx sex age
1 1 1 Lev+5FU 1 43
2 1 1 Lev+5FU 1 43
3 2 1 Lev+5FU 1 63

測定

Seriesを指定して抽出

%%time
for i in range(20):
    for age in range(50):
        under_n = df[df.age < age]
CPU times: user 690 ms, sys: 7.92 ms, total: 698 ms
Wall time: 698 ms

queryの中に変数を埋め込んで抽出

%%time
for i in range(20):
    for age in range(50):
        under_n = df.query('age < @age')
CPU times: user 1.84 s, sys: 27.3 ms, total: 1.86 s
Wall time: 1.89 s

結果

parseがどれくらい複雑かによるが、queryはbool型のseries指定のより数倍遅かった。

parseするのに時間がかかってるだけで、 データが大量になったところで差が出るのはparseの部分だけだと思うので、基本的にはqueryでも全然問題ないんだろうか。 繰り返し使うときは考慮しようと思った。

(時間があるとき数十万行のデータとかで試そう・・・)