Pandas df.filter() 関数

Pandas 常用函数Pandas よく使う関数


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 パラメータを使用

列名のリストを直接指定して、特定の列を選択します。

実例

import pandas as pd

# 创建示例 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

コードの解説:

  1. filter(items=['name', 'age'])指定した列を選択し、これらの列を含む新しい DataFrame を返します。
  2. すべての行が保持され、特定の列が選択されるだけです。
  3. 指定した列名が存在しない場合、KeyError が発生します。

例2:like パラメータを使用 - あいまい一致

likeこのパラメータを使用すると、列名に指定した文字列を含む列をフィルタリングできます。これは、列名に規則性があるデータセットを扱う場合に非常に適しています。

実例

import pandas as pd

# 規則性のある列名を持つ 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 パラメータを使用 - 正規表現一致

より複雑な列名のフィルタリングが必要な場合は、正規表現を使用できます。

実例

import pandas as pd

# 複雑な列名を作成
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

コードの解説:

  1. filter(regex='^score_')使用して、^「score_」で始まる列をマッチングします。
  2. filter(regex='\d')使用して、\d数字を含む列名をマッチングします。
  3. 正規表現は最大の柔軟性を提供し、さまざまな複雑なマッチング要件を処理できます。

例4:axis パラメータを使用して行をフィルタリング

df.filter() はfilter()主に列に使用されますが、axisパラメータを使用して行をフィルタリングすることもできます。

実例

import pandas as pd

# 创建 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 pandas as pd
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 常用函数Pandas でよく使う関数

その他の拡張