つまりなにしたの?
DataFrameのqueryを使って、条件による行の抽出を直感的に見やすい式で書いた。
問題設定
a列については10より大きい、
b列とc列の和については20より大きい、
のいずれかを満たすみたいなのを直感的に見やすい式で作りたい
準備
10万件のデータから上記の条件で抽出してみる。
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(100000, 3)*10, columns=list('abc'))
素直な方法
dfをつなげまくる
df_norm = df[(df['a'] > 10) | (df['b']+df['c'] > 20)]
Queryを使う方法
df_query = df.query('a > 10 or (b+c) > 20')
直感的に見やすくて、スッキリかけて嬉しい。
時間の比較
# %% 素直な方法 %timeit df_norm = df[(df['a'] > 10) | (df['b']+df['c'] > 20)] 3.05 ms ± 77 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) # %% Queryを使う方法 %timeit df_query = df.query('a > 10 or (b+c) > 20', engine='python') 4.48 ms ± 337 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) %timeit df_query = df.query('a > 10 or (b+c) > 20', engine='numexpr') 3.79 ms ± 74.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
素直な方法のほうが速かった。
やってみてどうだった?
スッキリかけるほうが重視される場面ではとても良い。
あと、演算子側をコード中で変更できるのも便利な場面があるかもしれない。
残念ながらQueryのほうが実行時間はわずかにかかる。numexprで早くなるので入れておくと良さげ