PythonのPandasライブラリにおける DataFrame.query()
メソッドは、SQLライクな構文でデータフレームをフィルタリングできる便利な方法です。
ただし、変数を使って動的に条件を設定したい場合には、少し注意が必要です。
以下では、query()
の基本から、変数を使う方法、注意点や応用テクニックまで、段階的に丁寧に解説していきます。
目次
基本の query()
の使い方
まずは基本構文から見ていきましょう。
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35]
})
# 30歳以上の人を抽出
filtered = df.query("age >= 30")
print(filtered)
変数を使いたい場合の方法
方法: @変数名
の形式で使う
Pandasでは、@
を使うことで外部のPython変数を参照できます。
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35]
})
age_threshold = 30
filtered = df.query("age >= @age_threshold")
print(filtered)
これにより age_threshold
が展開され、df[df["age"] >= 30]
と同等の結果が得られます。
応用例:複数の変数を使う
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 40]
})
min_age = 26
max_age = 34
filtered = df.query("@min_age <= age <= @max_age")
print(filtered)
注意点:カラム名にスペースや記号がある場合
カラム名にスペースや記号(例: user name
, total-amount
)がある場合は、バッククオート `
で囲みます。
import pandas as pd
df = pd.DataFrame({
'user name': ['Alice', 'Bob'],
'score': [80, 90]
})
threshold = 85
filtered = df.query("`user name` == 'Bob' and score > @threshold")
print(filtered)
より動的な構文を作るテクニック
場合によっては、条件式をプログラム的に組み立てたいこともあります。
その場合は、Pythonの文字列操作を活用できます。
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'score': [88, 92, 85]
})
column = "score"
threshold = 90
query_str = f"{column} >= @threshold"
filtered = df.query(query_str)
print(filtered)
変数 column
の値によって異なる列を参照したい場合にも便利です。
DataFrame.query() を使うメリット
メリット | 説明 |
---|---|
可読性が高い | SQLライクで直感的に書ける |
変数を埋め込める | @変数 で柔軟に使える |
複雑な条件でも簡潔に記述可能 | "col1 > 10 and col2 == 'abc'" のように自然な表現が可能 |
eval() 同様の高速性 | numexpr を内部的に使用しており、高速な評価が可能なことがある(ただし限定的) |
query()
を使わない方がよい場面
- カラム名が多数スペースや記号を含むとき(可読性が落ちる)
- Pythonの変数名とカラム名が衝突して紛らわしくなるとき
- 非数値データや文字列の一致条件が複雑すぎるとき(通常のブールインデックスの方がシンプル)
まとめ
やりたいこと | 書き方 |
---|---|
固定値でフィルタ | df.query("age > 30") |
変数を使う | df.query("age > @age_threshold") |
変数でカラム指定 | df.query(f"{col} > @val") |
カラム名にスペース | df.query(" column name == 'something'") |
最後に:query()
or 通常の条件式、どちらを使うべき?
どちらも有用ですが、
- 可読性を重視したいとき →
query()
- 複雑な条件や関数ベースのフィルタ処理 → 通常の
df[...]
構文
というように、ケースバイケースで使い分けるのがベストです。
以上、PythonのPandasのデータフレームでqueryを変数を使う場合についてでした。
最後までお読みいただき、ありがとうございました。