PythonのPandasのデータフレームでqueryを変数を使う場合

Python,イメージ

AI実装検定のご案内

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を変数を使う場合についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次