Pandas df.query() 関数

Pandas よく使う関数


query()これは Pandas で非常に実用的なデータフィルタリング関数であり、SQL に似た文字列式を使用してデータをフィルタリングできます。従来のブールインデックス方式と比較して、query()構文がより簡潔で直感的であり、複雑なフィルタリング条件の処理に特に適しています。

データ分析の作業では、さまざまな条件に基づいてデータをフィルタリングする必要がよくあります。query()この関数はフィルタリング条件を文字列形式で記述します。SQL クエリを書くのと同じように、SQL に慣れたユーザーにとって非常に親しみやすいものです。また、Python の変数や関数も使用できるため、動的なフィルタリングが可能になります。


基本構文とパラメータ

query()df.query() は DataFrame のメソッドで、ドット演算子によって.呼び出します。フィルタリング式を含む文字列パラメータを1つ受け取ります。

構文形式

DataFrame.query(expr, inplace=False, **kwargs)

パラメータの説明

パラメータ 型 必須かどうか 説明 デフォルト値
expr str 必須 フィルタリング式。SQL の WHERE 句に似ています。 -
inplace bool オプション 元の DataFrame 上で直接変更するかどうか。 False

戻り値の説明

  • 戻り値の型: フィルタリング条件を満たす行を含む新しい DataFrame を返します。
  • 元のデータを変更しません: デフォルトでは、元の DataFrame は変更されません。

例

豊富な例を通して、query()の使い方を完全に習得しましょう。

例1: 基本的な使い方 - 単一条件フィルタリング

最も簡単なquery()使い方は、単一の条件を使用してフィルタリングすることです。

例

import pandas as pd

# 创建示例 DataFrame
data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
    'age': [18, 19, 17, 18, 20, 19, 18],
    'score': [85, 92, 78, 90, 88, 95, 82],
    'grade': ['A', 'A', 'B', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)

print("原始 DataFrame:")
print(df)
print()

# 点数が85より大きい学生を抽出
print(点数が85より大きい学生:)
print(df.query('score > 85'))
print()

# 年齢が18に等しい学生を抽出
print(年齢が18の学生:)
print(df.query('age == 18'))
print()

# 等級が A の学生をフィルタリングする
print(A 等級の学生:)
print(df.query('grade == "A"'))

実行結果:

原始 DataFrame:
      name  age  score grade
0    Alice   18     85     A
1      Bob   19     92     A
2  Charlie   17     78     B
3    David   18     90     A
4      Eve   20     88     B
5    Frank   19     95     A
6    Grace   18     82     B

分数大于 85 的学生:
      name  age  score grade
1      Bob   19     92     A
3    David   18     90     A
4      Eve   20     88     B
5    Frank   19     95     A

年龄等于 18 的学生:
      name  age  score grade
0    Alice   18     85     A
3    David   18     90     A
6    Grace   18     82     B

等级为 A 的学生:
      name  age  score grade
0    Alice   18     85     A
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

コードの解説:

  1. フィルタリング条件は引用符の中に記述し、SQL に似た構文を使用します。
  2. 数値の比較には、>, ==, <などの演算子を使用します。
  3. 文字列の比較には二重引用符または一重引用符を使用します。

例2: 複合条件フィルタリング

query()論理演算子を使用して複数の条件を組み合わせることができます。

例

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
    'age': [18, 19, 17, 18, 20, 19, 18],
    'score': [85, 92, 78, 90, 88, 95, 82],
    'grade': ['A', 'A', 'B', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)

# 使用 AND 条件:分数大于 85 且年龄小于 19
print("点数が85より大きく、かつ年齢が19未満の学生:")
print(df.query('score &gt; 85 and age  90'))
print()

# NOT 条件を使用:等級が A ではない
print("等級が A でない学生:")
print(df.query('not grade == "A"'))
print()

# 複雑な複合条件
print("年齢が18歳から20歳の間で、かつスコアが88に等しくない学生:")
print(df.query('age &gt;= 18 and age &lt;= 20 and score != 88&#039;))

実行結果:

分数大于 85 且年龄小于 19 的学生:
      name  age  score grade
3    David   18     90     A
5    Frank   19     95     A

等级为 A 或分数大于 90 的学生:
      name  age  score grade
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

等级不为 A 的学生:
      name  age  score grade
2  Charlie   17     78     B
4      Eve   20     88     B
6    Grace   18     82     B

年龄在 18 到 20 之间且分数不等于 88 的学生:
      name  age  score grade
0    Alice   18     85     A
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

コードの解説:

  1. 「&」を使用してand論理積(AND)を表します。
  2. 「|」を使用してor論理和(OR)を表します。
  3. 「~」を使用してnot論理否定(NOT)を表します。
  4. 複合条件は自由に組み合わせて、複雑なフィルタリングロジックを形成できます。

例3: Python変数を使用する

query()式の中で Python 変数を使用できます。これは動的なクエリで非常に便利です。

例

import pandas as pd

data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
    'age': [18, 19, 17, 18, 20, 19, 18],
    'score': [85, 92, 78, 90, 88, 95, 82],
    'grade': ['A', 'A', 'B', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)

# 使用 @ 符号引用 Python 变量
min_score = 85
target_grade = 'A'

print("使用变量筛选 - 分数大于 {}:".format(min_score))
print(df.query('score &gt; @min_score'))
print()

print("変数を使用してフィルタリング - 等級が '{}':".format(target_grade))
print(df.query('grade == @target_grade'))
print()

# リストを変数として使用する
target_grades = ['A', 'B']
print(グレードが{}内の学生:.format(target_grades))
print(df.query('grade in @target_grades'))
print()

# 使用 Python 函数
def get_average_score(df):
    return df['score'].mean()

print("平均点を上回る学生:")
print(df.query('score &gt; @get_average_score(df)'))

実行結果:

使用变量筛选 - 分数大于 85:
      name  age  score grade
1      Bob   19     92     A
3    David   18     90     A
4      Eve   20     88     B
5    Frank   19     95     A

使用变量筛选 - 等级为 'A':
      name  age  score grade
0    Alice   18     85     A
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

等级在 ['A', 'B'] 中的学生:
      name  age  score grade
0    Alice   18     85     A
1      Bob   19     92     A
2  Charlie   17     78     B
3    David   18     90     A
4      Eve   20     88     B
5    Frank   19     95     A
6    Grace   18     82     B

分数高于平均分的学生:
      name  age  score grade
1      Bob   19     92     A
3    David   18     90     A
5    Frank   19     95     A

コードの解説:

  • @ 記号を使用@すると、クエリ式内で Python 変数を参照できます。
  • Python リストを直接使用してin判定できます。
  • Python 関数を呼び出して動的なしきい値を計算できます。

例4:文字列操作

query()また、いくつかの一般的な文字列操作もサポートしています。

例

import pandas as pd

# 文字列列を持つ DataFrame を作成
data = {
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace'],
    'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai', 'Beijing', 'Shenzhen'],
    'score': [85, 92, 78, 90, 88, 95, 82]
}
df = pd.DataFrame(data)

# 特定の都市のレコードを抽出
print("北京にいる学生:")
print(df.query('city == "Beijing"'))
print()

# 字符串包含判断(使用 in)
print(上海または北京の学生:)
print(df.query('city in ["Shanghai", "Beijing"]'))
print()

# 文字列を含む変数を参照するには @ を使用する
target_city = 'Guangzhou'
print("{} の学生:".format(target_city))
print(df.query('city == @target_city'))

実行結果:

在北京的学生:
      name      city  score
0    Alice   Beijing     85
2  Charlie   Beijing     78
5    Frank   Beijing     95

在上海或北京的学生:
      name      city  score
0    Alice   Beijing     85
1      Bob   Shanghai     92
2  Charlie   Beijing     78
4      Eve   Shanghai     88
5    Frank   Beijing     95

在 Guangzhou 的学生:
      name       city  score
3    David  Guangzhou     90

コードの解説:

  • query()文字列の等価比較をサポートしています。
  • 「in」キーワードを使用してin要素がリスト内にあるかどうかを判定できます。
  • @ を使用して@文字列変数を参照できます。

例5: 列名にスペースや特殊文字が含まれる場合の処理

列名にスペースや特殊文字が含まれる場合は、バッククォート `` ` `` で列名を囲むことができます。

例

import pandas as pd

# 列名にスペースを含む DataFrame を作成
data = {
    'student name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
    'score': [85, 92, 78, 90, 88],
    'pass status': [True, True, False, True, True]
}
df = pd.DataFrame(data)

print("原始 DataFrame(列名包含空格):")
print(df)
print()

# 使用反引号包裹列名
print(点数が85より大きい学生:)
print(df.query('`score` &gt; 85'))
print()

print(ステータスが True の学生:)
print(df.query('`pass status` == True'))
print()

# この方法を使って予約語を列名として扱うこともできます
df2 = pd.DataFrame({
    'class': ['A', 'B', 'A', 'B', 'A'],
    'def': [1, 2, 3, 4, 5]  # def は Python の予約語
})
print(予約語を列名として使用:)
print(df2.query('`def` &gt; 3'))

実行結果:

原始 DataFrame(列名包含空格):
  student name  score  pass status
0       Alice     85        True
1         Bob     92        True
2    Charlie     78       False
3     David   90        True
4        Eve     88        True

分数大于 85 的学生:
  student name  score  pass status
1         Bob     92        True
3       David     90        True
4        Eve     88        True

通过状态为 True 的学生:
  student name  score  pass status
0       Alice     85        True
1         Bob     92        True
3       David     90        True
4        Eve     88        True

使用保留字作为列名:
  class  def
3     B    4
4     A    5

コードの解説:

  • バッククォートを使用することで、列名にスペースが含まれる場合や Python の予約語と衝突する場合を処理できます。
  • `score`と`pass status`列名を参照するために使用します。
  • `def`Python の予約語を列名として扱う方法を示しています。

注意事項

  • query()式内の列名は有効な Python 識別子であるか、バッククォートで囲む必要があります。
  • 文字列の比較には一重引用符または二重引用符を使用できます。
  • @ 記号を使用して@Python 変数を参照します。
  • 大規模な DataFrame の場合、query()のパフォーマンスは通常、従来のブールインデックスよりも優れています。
  • フィルタリング式に予約語や特殊文字が含まれる場合は、バッククォートを使用する必要があります。

ヒント:query()動的にフィルタリング条件を構築する必要がある場面に特に適しています。例えば、ユーザー入力や設定ファイルに基づいてデータをフィルタリングする場合です。Python の文字列フォーマット機能と組み合わせることで、非常に柔軟なデータクエリを実現できます。


まとめ

query()df.query() は Pandas の強力なデータフィルタリング関数であり、SQL に似たクエリ構文を提供するため、複雑な条件フィルタリングがより簡潔で読みやすくなります。

主な利点は次のとおりです。構文が簡潔で直感的、複合論理演算をサポート、Python 変数と関数をサポート、特殊な列名を処理できる。実際のデータ分析では、特に動的にフィルタリング条件を構築する必要がある場合、query()は非常に実用的なツールです。

Pandas よく使う関数

その他の拡張