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でも全然問題ないんだろうか。 繰り返し使うときは考慮しようと思った。
(時間があるとき数十万行のデータとかで試そう・・・)