Pandas df.filter() 関数
filter()これは、Pandas において列(行ではなく)をフィルタリングするための関数です。列名、ラベルパターン、または正規表現に基づいて特定の列を選択できます。とはloc[]とiloc[]異なり、filter()列の選択専用に設計されており、大量の列を持つデータセットを扱う場合に非常に役立ちます。
データ分析では、特定の列のみに注目したい場合があります。たとえば、数値列のみを選択する、特定の接頭辞で始まる列を選択する、特定のキーワードを含む列を選択するなどです。filter()まさにこれらのシナリオのために設計されています。
基本構文とパラメータ
filter()これは、DataFrame と Series(Series の場合は items パラメータのみサポート)のメソッドで、条件に基づいて列をフィルタリングします。
構文形式
DataFrame.filter(items=None, like=None, regex=None, axis=None)
パラメータの説明
| パラメータ | 型 | 必須かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| items | list | 任意 | 列名のリストを直接指定して、一致する列を選択します。 | None |
| like | str | 任意 | 指定した文字列を含む列名。あいまい一致をサポートします。 | None |
| regex | str | 任意 | 列名に一致する正規表現パターン。 | None |
| axis | int または str | 任意 | フィルタリングする軸。0 または 'index' は行を、1 または 'columns' は列を表します。 | 1 または 'columns' |
戻り値の説明
- 戻り値の型: フィルタリングされた列を含む新しい DataFrame を返します。
- 列のフィルタリング: デフォルトでは、
filter()列(axis=1)に作用します。 - すべての行を保持します。: フィルタリングは列にのみ影響し、行データは変更されません。
実例
豊富な例を通して、filter()その使い方を包括的に理解しましょう。
例1:基本的な使い方 - items パラメータを使用
列名のリストを直接指定して、特定の列を選択します。
実例
# 创建示例 DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B'],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai']
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
print()
# 使用 items 参数选择特定列
print(name 列と age 列を選択:)
print(df.filter(items=['name', 'age']))
print()
# 选择单列(返回 DataFrame)
print("只选择 score 列:")
print(df.filter(items=['score']))
実行結果:
原始 DataFrame:
name age score grade city
0 Alice 18 85 A Beijing
1 Bob 19 92 A Shanghai
2 Charlie 17 78 B Beijing
3 David 18 90 A Guangzhou
4 Eve 20 88 B Shanghai
选择 name 和 age 列:
name age
0 Alice 18
1 Bob 19
2 Charlie 17
3 David 18
4 Eve 20
只选择 score 列:
score
0 85
1 92
2 78
3 90
4 88
コードの解説:
filter(items=['name', 'age'])指定した列を選択し、これらの列を含む新しい DataFrame を返します。- すべての行が保持され、特定の列が選択されるだけです。
- 指定した列名が存在しない場合、KeyError が発生します。
例2:like パラメータを使用 - あいまい一致
likeこのパラメータを使用すると、列名に指定した文字列を含む列をフィルタリングできます。これは、列名に規則性があるデータセットを扱う場合に非常に適しています。
実例
# 規則性のある列名を持つ DataFrame を作成
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age_2020': [18, 19, 17, 18, 20],
'age_2021': [19, 20, 18, 19, 21],
'age_2022': [20, 21, 19, 20, 22],
'score_2020': [85, 92, 78, 90, 88],
'score_2021': [87, 94, 80, 92, 90],
'score_2022': [89, 96, 82, 94, 92],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai']
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
print()
# "age" を含むすべての列を選択
print('age' を含む列:)
print(df.filter(like='age'))
print()
# "score" を含むすべての列を選択
print("'score' を含む列:")
print(df.filter(like='score'))
print()
# 「2021」を含むすべての列を選択
print("'2021' を含む列:")
print(df.filter(like='2021'))
実行結果:
原始 DataFrame:
name age_2020 age_2021 age_2022 score_2020 score_2021 score_2022 city
0 Alice 18 19 20 85 87 89 Beijing
1 Bob 19 20 21 92 94 96 Shanghai
2 Charlie 17 18 19 78 80 82 Beijing
3 David 18 19 20 90 92 94 Guangzhou
4 Eve 20 21 22 88 90 92 Shanghai
包含 'age' 的列:
age_2020 age_2021 age_2022
0 18 19 20
1 19 20 21
2 17 18 19
3 18 19 20
4 20 21 22
包含 'score' 的列:
score_2020 score_2021 score_2022
0 85 87 89
1 92 94 96
2 78 80 82
3 90 92 94
4 88 90 92
包含 '2021' 的列:
age_2021 score_2021
0 19 87
1 20 94
2 18 80
3 19 92
4 21 90
コードの解説:
filter(like='age')列名に「age」を含むすべての列を選択します。- あいまい一致では完全な列名を知る必要はなく、部分一致する文字列を指定するだけで済みます。
- これは、同様の命名規則を持つ列(年ごとに整理された列など)を扱う場合に特に役立ちます。
例3:regex パラメータを使用 - 正規表現一致
より複雑な列名のフィルタリングが必要な場合は、正規表現を使用できます。
実例
# 複雑な列名を作成
data = {
'id': [1, 2, 3, 4, 5],
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age_2020': [18, 19, 17, 18, 20],
'age_2021': [19, 20, 18, 19, 21],
'score_math': [85, 92, 78, 90, 88],
'score_english': [87, 94, 80, 92, 90],
'score_science': [89, 96, 82, 94, 92],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou', 'Shanghai']
}
df = pd.DataFrame(data)
print(元の DataFrame の列:)
print(df.columns.tolist())
print()
# "score_" で始まる列を選択
print('score_' で始まる列:)
print(df.filter(regex='^score_'))
print()
# 数字を含む列名を選択
print("数字を含む列名:")
print(df.filter(regex='\d')) # d 匹配数字
print()
# "age" と "202" を両方含む列を選択
print("'age' と '202' を含む列:")
print(df.filter(regex='age.*202|202.*age'))
print()
# アルファベットで始まり、アンダースコアを含まない列を選択
print("文字で始まり、アンダースコアを含まない列:")
print(df.filter(regex='^[a-zA-Z]+$'))
実行結果:
原始 DataFrame 的列:
['id', 'name', 'age_2020', 'age_2021', 'score_math', 'score_english', 'score_science', 'city']
以 'score_' 开头的列:
score_math score_english score_science
0 85 87 89
1 92 94 96
2 78 80 82
3 90 92 94
4 88 90 92
包含数字的列名:
age_2020 age_2021 score_math score_english score_science
0 18 19 85 87 89
1 19 20 92 94 96
2 17 18 78 80 82
3 18 19 90 92 94
4 20 21 88 90 92
包含 'age' 和 '202' 的列:
age_2020 age_2021
0 18 19
1 19 20
2 17 18
3 18 19
4 20 21
以字母开头且不含下划线的列:
name city
0 Alice Beijing
1 Bob Shanghai
2 Charlie Beijing
3 David Guangzhou
4 Eve Shanghai
コードの解説:
filter(regex='^score_')使用して、^「score_」で始まる列をマッチングします。filter(regex='\d')使用して、\d数字を含む列名をマッチングします。- 正規表現は最大の柔軟性を提供し、さまざまな複雑なマッチング要件を処理できます。
例4:axis パラメータを使用して行をフィルタリング
df.filter() はfilter()主に列に使用されますが、axisパラメータを使用して行をフィルタリングすることもできます。
実例
# 创建 DataFrame,带有命名索引
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data, index=['row1', 'row2', 'row3', 'row4', 'row5'])
print("名前付きインデックスの DataFrame:")
print(df)
print()
# 使用 axis='index' 筛选行(使用 like)
print("インデックスに 'row' を含む行:")
print(df.filter(like='row', axis='index'))
print()
# items を使用して特定のインデックスの行を抽出
print(インデックスが 'row1' と 'row3' の行:)
print(df.filter(items=['row1', 'row3'], axis='index'))
print()
# 使用 regex 筛选行
print("索引匹配正则表达式(row)
print(df.filter(regex='row[135]', axis='index'))
実行結果:
带命名索引的 DataFrame:
name age score
row1 Alice 18 85
row2 Bob 19 92
row3 Charlie 17 78
row4 David 18 90
row5 Eve 20 88
索引包含 'row' 的行:
name age score
row1 Alice 18 85
row2 Bob 19 92
row3 Charlie 17 78
row4 David 18 90
row5 Eve 20 88
索引为 'row1' 和 'row3' 的行:
name age score
row1 Alice 18 85
row3 Charlie 17 78
索引匹配正则表达式(row[135])的行:
name age score
row1 Alice 18 85
row3 Charlie 17 78
row5 Eve 20 88
コードの解説:
axis='index'或axis=0df.filter() にfilter()行インデックスをフィルタリングするよう指示します。like、items、regexパラメータの行フィルタリングでの使い方は、列フィルタリングと同じです。- これは、インデックス名に基づいて特定の行をフィルタリングする必要がある場合に非常に役立ちます。
例5:他の関数と組み合わせて使用
filter()他の Pandas 関数と組み合わせて使用することで、強力なデータ選択機能を実現できます。
実例
import numpy as np
# 创建一个大型 DataFrame
np.random.seed(42)
df = pd.DataFrame(np.random.randn(5, 10), columns=[
'A', 'B', 'C', 'D', 'E',
'AA', 'BB', 'CC', 'DD', 'EE'
])
print(元の DataFrame の列:)
print(df.columns.tolist())
print()
# 筛选单字母列并进行计算
single_letter_cols = df.filter(regex='^[A-E]$')
print("単一文字の列(A-E)の平均:")
print(single_letter_cols.mean())
print()
# 筛选双字母列并进行计算
double_letter_cols = df.filter(regex='^[A-E]{2}$')
print("2文字の列(AA-EE)の平均:")
print(double_letter_cols.mean())
print()
# 先筛选列,再选择行
print("二文字の列の先頭3行:")
print(df.filter(regex='^[A-E]{2}$').head(3))
実行結果:
原始 DataFrame 的列:
['A', 'B', 'C', 'D', 'E', 'AA', 'BB', 'CC', 'DD', 'EE']
单字母列(A-E)的均值:
A 0.336744
B 0.128223
C -0.234007
D -0.347540
E -0.197939
dtype: float64
双字母列(AA-EE)的均值:
AA 0.530256
BB -0.671336
CC 0.506853
DD -0.443588
EE -0.456486
dtype: float64
双字母列的前 3 行:
AA BB CC DD EE
0 -0.013497 -1.174139 0.214864 1.550698 0.375698
1 -1.368593 0.746580 0.669383 -0.717552 -1.159950
2 0.602619 -1.700736 -0.201647 -0.605166 -0.012750
コードの解説:
filter()他の DataFrame メソッドとメソッドチェーンで呼び出すことができます。- 最初に特定の列をフィルタリングし、その後統計計算を行うことで、コードの可読性が向上します。
- これは、列数が多いテーブルを扱う場合に特に役立ちます。
注意事項
items列名を正確に指定するために使用し、likeあいまい一致に使用し、regex正規表現のマッチングに使用します。実際のニーズに応じて適切な方法を選択してください。- 大規模なデータセットを扱う場合は、まず
filter()必要な列をフィルタリングすると、後続の計算のデータ量を減らし、パフォーマンスを向上させることができます。 filter()デフォルトでは列(axis=1)に作用しますが、axis='index'或axis=0フィルタリング方向を変更できます。- 注意:
items、like、regexこれら3つのパラメータは相互に排他的であり、同時に使用することはできません。
ヒント:
filter()df.filter() は、列数の多いテーブル(多くの列を持つデータセット)を扱う際の強力なツールです。特にデータ探索の段階で、特定の種類の情報(すべての数値列、特定の接頭辞で始まるすべての列など)だけに注目したい場合は、使用すると、filter()列のフィルタリングをすばやく行えます。
まとめ
filter()Pandas において、列(および行)の抽出に特化した関数です。抽出方法は、完全一致指定(items)、あいまい一致(like)、正規表現一致(regex)の3つが用意されています。
この関数の主な適用シーンは、特定の列の抽出、規則性のある命名規約に従った列の処理、分析に必要な列の動的な選択です。他の Pandas 関数と組み合わせて使用することで、データ処理の効率とコードの可読性を大幅に向上させることができます。
その他の拡張
Pandas よく使う関数