EnsekiTT Blog

EnsekiTTが書くブログです。

DataFrameのQueryを使って条件に合致する行を抽出する話

つまりなにしたの?

DataFrameのqueryを使って、条件による行の抽出を直感的に見やすい式で書いた。
f:id:ensekitt:20180612200024j:plain

問題設定

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で早くなるので入れておくと良さげ

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。