Pandas df.query() 関数
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()使い方は、単一の条件を使用してフィルタリングすることです。
例
# 创建示例 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
コードの解説:
- フィルタリング条件は引用符の中に記述し、SQL に似た構文を使用します。
- 数値の比較には、
>,==,<などの演算子を使用します。 - 文字列の比較には二重引用符または一重引用符を使用します。
例2: 複合条件フィルタリング
query()論理演算子を使用して複数の条件を組み合わせることができます。
例
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 > 85 and age 90'))
print()
# NOT 条件を使用:等級が A ではない
print("等級が A でない学生:")
print(df.query('not grade == "A"'))
print()
# 複雑な複合条件
print("年齢が18歳から20歳の間で、かつスコアが88に等しくない学生:")
print(df.query('age >= 18 and age <= 20 and score != 88'))
実行結果:
分数大于 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
コードの解説:
- 「&」を使用して
and論理積(AND)を表します。 - 「|」を使用して
or論理和(OR)を表します。 - 「~」を使用して
not論理否定(NOT)を表します。 - 複合条件は自由に組み合わせて、複雑なフィルタリングロジックを形成できます。
例3: Python変数を使用する
query()式の中で Python 変数を使用できます。これは動的なクエリで非常に便利です。
例
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 > @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 > @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()また、いくつかの一般的な文字列操作もサポートしています。
例
# 文字列列を持つ 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: 列名にスペースや特殊文字が含まれる場合の処理
列名にスペースや特殊文字が含まれる場合は、バッククォート `` ` `` で列名を囲むことができます。
例
# 列名にスペースを含む 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` > 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` > 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()は非常に実用的なツールです。