[Python/Pandas] query関数の使い方 – 条件に合う行を抽出する
Pandasのquery
関数は、DataFrameから特定の条件に合う行を抽出するために使用されます。
クエリ条件を文字列形式で指定し、列名を直接参照できます。
例えば、df.query('age > 30 and city == "Tokyo"')
のように記述します。
条件内ではand
やor
、not
などの論理演算子が使え、列名にスペースや特殊文字が含まれる場合はバッククォート(\)
で囲みます。
数式や関数も利用可能で、変数を使う場合は@
を付けて参照します(例:df.query('age > @threshold')
)。
query
は可読性が高く、複雑な条件を簡潔に記述できる点が特徴です。
query関数とは
query
関数は、Pandasライブラリにおいてデータフレームから特定の条件に合致する行を抽出するための便利なメソッドです。
この関数を使用することで、SQLのようなクエリ文法を用いてデータをフィルタリングすることができます。
これにより、複雑な条件を簡潔に表現でき、可読性の高いコードを書くことが可能になります。
特徴
- SQLライクな文法: SQLに慣れている人にとって、直感的に使いやすい。
- 可読性: 条件を明示的に記述できるため、コードの理解が容易。
- 柔軟性: 複数の条件を組み合わせて使用することができる。
以下は、query
関数を使用してデータフレームから特定の条件に合う行を抽出する基本的な例です。
import pandas as pd
# サンプルデータの作成
data = {
'名前': ['田中', '鈴木', '佐藤', '山田'],
'年齢': [25, 30, 22, 35],
'職業': ['エンジニア', 'デザイナー', 'エンジニア', 'マネージャー']
}
df = pd.DataFrame(data)
# 年齢が30以上の行を抽出
result = df.query('年齢 >= 30')
print(result)
名前 年齢 職業
1 鈴木 30 デザイナー
3 山田 35 マネージャー
この例では、年齢が30以上の行を抽出しています。
query
関数を使うことで、条件を簡潔に記述できることがわかります。
query関数の基本的な使い方
query
関数を使用することで、Pandasのデータフレームから特定の条件に合致する行を簡単に抽出できます。
基本的な使い方を以下に示します。
基本構文
query
関数の基本的な構文は以下の通りです。
DataFrame.query(expr, inplace=False, **kwargs)
expr
: 抽出したい条件を文字列で指定します。inplace
: デフォルトはFalse
。
True
にすると元のデータフレームが変更されます。
**kwargs
: 他の引数を指定することができます。
以下の例では、query
関数を使って特定の条件に合う行を抽出します。
import pandas as pd
# サンプルデータの作成
data = {
'名前': ['田中', '鈴木', '佐藤', '山田'],
'年齢': [25, 30, 22, 35],
'職業': ['エンジニア', 'デザイナー', 'エンジニア', 'マネージャー']
}
df = pd.DataFrame(data)
# 職業が「エンジニア」の行を抽出
result = df.query('職業 == "エンジニア"')
print(result)
名前 年齢 職業
0 田中 25 エンジニア
2 佐藤 22 エンジニア
この例では、職業が「エンジニア」である行を抽出しています。
query
関数を使うことで、条件を簡潔に記述でき、可読性の高いコードを書くことができます。
複数条件の指定
query
関数では、複数の条件を組み合わせて使用することも可能です。
以下の例では、年齢が25以上かつ職業が「エンジニア」である行を抽出します。
# 年齢が25以上かつ職業が「エンジニア」の行を抽出
result = df.query('年齢 >= 25 and 職業 == "エンジニア"')
print(result)
名前 年齢 職業
0 田中 25 エンジニア
このように、query
関数を使うことで、複雑な条件を簡単に指定することができます。
query関数での列名の扱い
query
関数を使用する際、データフレームの列名をどのように扱うかは重要なポイントです。
特に、列名にスペースや特殊文字が含まれている場合、適切な記述方法を理解しておく必要があります。
以下に、列名の扱いに関する基本的なルールと例を示します。
基本ルール
- 通常の列名: 列名が英数字やアンダースコアのみで構成されている場合、特に何もせずにそのまま使用できます。
- スペースを含む列名: スペースが含まれる列名は、バッククォート(
`)で囲む必要があります。
- 特殊文字を含む列名: 特殊文字が含まれる場合も、バッククォートで囲むことで正しく扱えます。
通常の列名
以下の例では、通常の列名を使用してquery
関数を実行します。
import pandas as pd
# サンプルデータの作成
data = {
'名前': ['田中', '鈴木', '佐藤'],
'年齢': [25, 30, 22]
}
df = pd.DataFrame(data)
# 年齢が25以上の行を抽出
result = df.query('年齢 >= 25')
print(result)
名前 年齢
0 田中 25
1 鈴木 30
スペースを含む列名
次の例では、列名にスペースが含まれている場合の扱いを示します。
# スペースを含む列名のデータフレームを作成
data = {
'フル ネーム': ['田中 太郎', '鈴木 次郎', '佐藤 三郎'],
'年齢': [25, 30, 22]
}
df = pd.DataFrame(data)
# 年齢が30以上の行を抽出
result = df.query('`フル ネーム` == "鈴木 次郎"')
print(result)
フル ネーム 年齢
1 鈴木 次郎 30
特殊文字を含む列名
特殊文字を含む列名の例も見てみましょう。
# 特殊文字を含む列名のデータフレームを作成
data = {
'名前#1': ['田中', '鈴木', '佐藤'],
'年齢': [25, 30, 22]
}
df = pd.DataFrame(data)
# 名前#1が「鈴木」の行を抽出
result = df.query('`名前#1` == "鈴木"')
print(result)
名前#1 年齢
1 鈴木 30
query
関数を使用する際は、列名の扱いに注意が必要です。
通常の列名はそのまま使用できますが、スペースや特殊文字が含まれる場合はバッククォートで囲むことで正しく処理できます。
このルールを理解しておくことで、query
関数をより効果的に活用できるようになります。
query関数で変数を使用する方法
query
関数では、外部の変数を使用して条件を指定することも可能です。
これにより、動的に条件を変更したり、プログラムの他の部分から値を取得してフィルタリングを行うことができます。
変数を使用する際は、@
記号を使って変数を参照します。
以下に具体的な例を示します。
変数の使用例
基本的な使用法
まず、基本的な変数の使用法を見てみましょう。
以下の例では、年齢の閾値を変数として定義し、その変数をquery
関数で使用しています。
import pandas as pd
# サンプルデータの作成
data = {
'名前': ['田中', '鈴木', '佐藤', '山田'],
'年齢': [25, 30, 22, 35]
}
df = pd.DataFrame(data)
# 年齢の閾値を変数として定義
age_threshold = 30
# 年齢が閾値以上の行を抽出
result = df.query('年齢 >= @age_threshold')
print(result)
名前 年齢
1 鈴木 30
3 山田 35
この例では、age_threshold
という変数を使用して、年齢が30以上の行を抽出しています。
@
記号を使うことで、変数をquery
関数内で参照できることがわかります。
複数の変数を使用する
複数の変数を使用することも可能です。
以下の例では、年齢の閾値と職業を変数として定義し、両方の条件を満たす行を抽出します。
# 職業の条件を変数として定義
job_condition = 'エンジニア'
age_threshold = 25
# 年齢が閾値以上かつ職業が指定した条件の行を抽出
result = df.query('年齢 >= @age_threshold and 職業 == @job_condition')
print(result)
名前 年齢 職業
0 田中 25 エンジニア
注意点
- 変数は
query
関数内で@
記号を使って参照する必要があります。 - 変数のスコープに注意し、
query
関数が呼び出される時点で有効な変数であることを確認してください。
query
関数で変数を使用することで、より柔軟で動的なデータフィルタリングが可能になります。
特に、条件が変わる可能性がある場合や、他の部分から値を取得してフィルタリングを行いたい場合に非常に便利です。
query関数で使用可能な演算子と関数
query
関数では、データフレームの行をフィルタリングするためにさまざまな演算子や関数を使用できます。
これにより、複雑な条件を簡潔に表現することが可能です。
以下に、主な演算子と関数を紹介します。
主な演算子
演算子 | 説明 | 使用例 |
---|---|---|
== | 等しい | df.query('年齢 == 30') |
!= | 等しくない | df.query('年齢 != 30') |
> | より大きい | df.query('年齢 > 25') |
< | より小さい | df.query('年齢 < 30') |
>= | 以上 | df.query('年齢 >= 30') |
<= | 以下 | df.query('年齢 <= 30') |
and | 論理積(AND) | df.query('年齢 > 25 and 職業 == "エンジニア"') |
or | 論理和(OR) | df.query('年齢 < 25 or 職業 == "デザイナー"') |
not | 否定 | df.query('not (年齢 < 25)') |
使用可能な関数
query
関数内では、いくつかの組み込み関数を使用することもできます。
以下は、よく使われる関数の例です。
関数名 | 説明 | 使用例 |
---|---|---|
len() | 要素の数を返す | df.query('len(名前) > 2') |
abs() | 絶対値を返す | df.query('abs(年齢 - 30) < 5') |
round() | 四捨五入 | df.query('round(年齢 / 10) == 3') |
str.contains() | 文字列が含まれているかを判定 | df.query('名前.str.contains("田")') |
以下の例では、演算子と関数を組み合わせて使用しています。
import pandas as pd
# サンプルデータの作成
data = {
'名前': ['田中', '鈴木', '佐藤', '山田'],
'年齢': [25, 30, 22, 35],
'職業': ['エンジニア', 'デザイナー', 'エンジニア', 'マネージャー']
}
df = pd.DataFrame(data)
# 年齢が30以上かつ名前に「田」が含まれる行を抽出
result = df.query('年齢 >= 30 and 名前.str.contains("田")')
print(result)
名前 年齢 職業
3 山田 35 マネージャー
query
関数では、さまざまな演算子や関数を使用してデータをフィルタリングできます。
これにより、複雑な条件を簡潔に表現でき、可読性の高いコードを書くことが可能になります。
演算子や関数を適切に使いこなすことで、データ分析の効率を大幅に向上させることができます。
query関数の応用例
query
関数は、データフレームから特定の条件に合致する行を抽出するための強力なツールです。
ここでは、実際のデータ分析シナリオにおける応用例をいくつか紹介します。
これにより、query
関数の使い方をより深く理解できるでしょう。
複数条件の組み合わせ
複数の条件を組み合わせてデータをフィルタリングすることができます。
以下の例では、年齢が25以上かつ職業が「エンジニア」である行を抽出します。
import pandas as pd
# サンプルデータの作成
data = {
'名前': ['田中', '鈴木', '佐藤', '山田'],
'年齢': [25, 30, 22, 35],
'職業': ['エンジニア', 'デザイナー', 'エンジニア', 'マネージャー']
}
df = pd.DataFrame(data)
# 年齢が25以上かつ職業が「エンジニア」の行を抽出
result = df.query('年齢 >= 25 and 職業 == "エンジニア"')
print(result)
名前 年齢 職業
0 田中 25 エンジニア
変数を使用した動的フィルタリング
外部の変数を使用して、動的に条件を変更することも可能です。
以下の例では、年齢の閾値を変数として定義し、その変数を使ってフィルタリングを行います。
# 年齢の閾値を変数として定義
age_threshold = 30
# 年齢が閾値以上の行を抽出
result = df.query('年齢 >= @age_threshold')
print(result)
名前 年齢 職業
1 鈴木 30 デザイナー
3 山田 35 マネージャー
文字列操作を用いたフィルタリング
query
関数では、文字列操作を用いて特定の条件を満たす行を抽出することもできます。
以下の例では、名前に「田」が含まれる行を抽出します。
# 名前に「田」が含まれる行を抽出
result = df.query('名前.str.contains("田")')
print(result)
名前 年齢 職業
0 田中 25 エンジニア
3 山田 35 マネージャー
データの集計とフィルタリング
query
関数を使用して、集計結果に基づいてデータをフィルタリングすることも可能です。
以下の例では、年齢の平均を計算し、その平均以上の年齢を持つ行を抽出します。
# 年齢の平均を計算
average_age = df['年齢'].mean()
# 年齢が平均以上の行を抽出
result = df.query('年齢 >= @average_age')
print(result)
名前 年齢 職業
1 鈴木 30 デザイナー
3 山田 35 マネージャー
query
関数は、データフレームの行を効率的にフィルタリングするための強力なツールです。
複数条件の組み合わせ、変数の使用、文字列操作、集計結果に基づくフィルタリングなど、さまざまな応用が可能です。
これらの例を参考にして、実際のデータ分析におけるquery
関数の活用方法を考えてみてください。
まとめ
この記事では、Pandasのquery
関数を使用してデータフレームから特定の条件に合致する行を抽出する方法について詳しく解説しました。
基本的な使い方から、列名の扱いや変数の使用、演算子や関数の活用方法、さらには実際の応用例に至るまで、幅広く取り上げました。
これらの知識を活かして、データ分析の効率を向上させるために、ぜひ実際のプロジェクトでquery
関数を試してみてください。