Pandas filter()で特定の行・列を効率抽出!名前の条件でデータ選択 🔍


 

PandasのDataFrameから特定の行や列を選択する際、locilocが非常に強力ですが、行名や列名に共通のパターンがある場合に特に便利なのが**filter()メソッド**です。このメソッドを使えば、正規表現や部分文字列を使って、柔軟かつ効率的に目的の行や列を抽出・選択できます。データセットから特定のキーワードを含む列だけを抜き出したい、あるいは特定のIDパターンを持つ行だけを絞り込みたい、といった場面でfilter()はその真価を発揮します。

この記事では、filter()メソッドの基本的な使い方から、正規表現や部分文字列でのパターンマッチング、そして行と列への適用方法までを、具体的なコード例を交えながら詳しく解説します。


 

filter()とは?なぜ使うのか? 🤔

 

filter()メソッドは、DataFrameのインデックス(行名)または列名(カラム名)が特定の条件(パターン)に一致するものを抽出します。

 

filter()を使うメリット

 

  • パターンマッチング: 列名や行名に共通のパターンがある場合に、手作業でリストを作成する手間を省けます。

  • 柔軟な条件指定: 正規表現や部分文字列でのマッチングに対応しているため、動的なデータ選択が可能です。

  • コードの簡潔化: 複数の条件をorで繋ぐよりも、簡潔に記述できます。


 

filter()の基本的な使い方 ✨

 

filter()メソッドは、itemslikeregexのいずれかの引数を使って、フィルタリングの条件を指定します。また、axis引数で「行」に適用するか「列」に適用するかを制御します。

 

1. items:正確な名前で抽出

 

items引数には、抽出したい列名や行名のリストを正確に指定します。これは、列や行のリストを直接[]で渡すのと似ていますが、filter()の統一されたインターフェース内で利用できます。

Python
 
import pandas as pd

df = pd.DataFrame({
    'ID_A': [1, 2],
    'Value_B': [10, 20],
    'Status_C': ['Active', 'Inactive']
})

print("--- 元のDataFrame ---")
print(df)

# 'ID_A'と'Status_C'列をitemsで抽出
df_items = df.filter(items=['ID_A', 'Status_C'])
print("\n--- itemsで列を抽出 ---")
print(df_items)

 

2. like:部分文字列で抽出(含む)🔍

 

like引数には、列名や行名に含まれる部分文字列を指定します。大文字・小文字は区別されます。

Python
 
import pandas as pd

df = pd.DataFrame({
    '商品_ID': [1, 2],
    '商品名_JP': ['りんご', 'みかん'],
    'Price_USD': [100, 80],
    'Stock_JP': [50, 120]
})

print("--- 元のDataFrame ---")
print(df)

# 'JP'を含む列名を抽出
df_jp_cols = df.filter(like='JP', axis=1) # axis=1で列に適用
print("\n--- 'JP'を含む列名を抽出 (like) ---")
print(df_jp_cols)

# 行インデックスに'idx'を含む行を抽出 (axis=0)
df_rows = pd.DataFrame({'Data': [10, 20]}, index=['idx_0', 'row_1'])
df_idx_rows = df_rows.filter(like='idx', axis=0)
print("\n--- 'idx'を含む行名を抽出 (like) ---")
print(df_idx_rows)

 

3. regex:正規表現で抽出(高度なパターンマッチング)✨

 

regex引数には、正規表現パターンを指定します。これにより、より複雑な条件で列名や行名をマッチングさせることができます。

Python
 
import pandas as pd

df = pd.DataFrame({
    'user_id': [1, 2],
    'item_name': ['Pen', 'Book'],
    'total_amount': [1000, 2000],
    'product_category': ['Stationery', 'Books']
})

# 'id' または 'category' で終わる列名を抽出 (正規表現)
df_regex_cols = df.filter(regex='(id|category)$', axis=1)
print("\n--- 正規表現で列名を抽出 ---")
print(df_regex_cols)

# 出力例:
#    user_id product_category
# 0        1       Stationery
# 1        2            Books

 

正規表現の例

 

  • ^prefix: ‘prefix’で始まる文字列

  • suffix$: ‘suffix’で終わる文字列

  • part: ‘part’を含む文字列 (likeと同じような効果)

  • col[0-9]+: ‘col’の後に数字が続く文字列 (例: ‘col1’, ‘col10’)

  • (col1|col2): ‘col1’または’col2’に一致する文字列


 

axis引数:行と列どちらに適用するか ↔️

 

filter()は、axis引数を使って行に適用するか列に適用するかを明示的に指定できます。

  • axis=0 または 'index': 行(インデックス名)に対してフィルタリングを適用します。

  • axis=1 または 'columns': 列(列名)に対してフィルタリングを適用します(デフォルト)。

Python
 
import pandas as pd

df = pd.DataFrame({
    'Data_A': [10, 20],
    'Data_B': [30, 40]
}, index=['Row_X', 'Row_Y'])

# 列名でフィルタリング (axis=1がデフォルトなので省略可)
cols_filtered = df.filter(like='Data', axis=1)
print("\n--- 列名をフィルタリング (axis=1) ---")
print(cols_filtered)

# 行名でフィルタリング
rows_filtered = df.filter(like='Row', axis=0)
print("\n--- 行名をフィルタリング (axis=0) ---")
print(rows_filtered)

 

まとめ:filter()の使い分け 💡

 

引数 説明 用途
items 完全一致する名前のリストで抽出 既知の特定の行名/列名を厳密に選択したい場合 df.filter(items=['col1', 'col2'])
like 指定した部分文字列を含む名前で抽出 特定のキーワードを含む行名/列名を簡単に抽出したい場合 df.filter(like='_ID')
regex 正規表現パターンに一致する名前で抽出 複雑な命名規則を持つ行名/列名を柔軟にパターンマッチングしたい場合 df.filter(regex='^user_.*')

filter()メソッドは、特に大規模なDataFrameで、列名や行名に命名規則がある場合に、データ選択の効率とコードの可読性を大きく向上させます。ぜひあなたのデータ分析ワークフローにfilter()を取り入れて、よりスマートなデータ操作を実現してください!