0Pricing
Pandas & NumPy Academy · レッスン

パターンによる列の選択

filter(like=)、filter(regex=)、リスト内包表記を使って、名前のパターンに一致する列を選択します。

「パターンによる列の選択」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

パターンで列を選択する理由

実世界のデータソースから取得したDataFrameには、数十から数百の列が含まれていることが多く、通常はすべての列を必要としません。列名にsales_のような接頭辞、_2023のような接尾辞、または特定のキーワードパターンがある場合、すべての列を明示的に列挙するよりも、名前のパターンで選択するほうがはるかに保守しやすくなります。スキーマが変更されても、パターンに基づく選択なら自動的に対応できます。

Pandasには、主にfilter()メソッドとdf.columnsに対するリスト内包表記という2つの方法があります。

import pandas as pd

df = pd.DataFrame({
    'sales_jan': [100, 200],
    'sales_feb': [150, 250],
    'cost_jan': [50, 80],
    'cost_feb': [60, 90],
    'profit': [140, 280]
})

print(df.columns.tolist())
# ['sales_jan', 'sales_feb', 'cost_jan', 'cost_feb', 'profit']

部分文字列の照合に使うfilter(like=)

DataFrame.filter(like='substring')は、指定した部分文字列を名前のどこかに含む列を選択します(大文字と小文字は区別されます)。デフォルトでは列軸に対して動作し、一致する列だけを含む新しいDataFrameを返します。

これは最も簡単なパターン選択ツールです。正規表現の知識は必要なく、探したい部分文字列を指定するだけです。

import pandas as pd

df = pd.DataFrame({
    'sales_jan': [100, 200],
    'sales_feb': [150, 250],
    'cost_jan': [50, 80],
    'revenue_q1': [110, 210]
})

# Select columns whose name contains 'sales'
sales_cols = df.filter(like='sales')
print(sales_cols)
#    sales_jan  sales_feb
# 0        100        150
# 1        200        250

パターン照合に使うfilter(regex=)

DataFrame.filter(regex='pattern')は、指定した正規表現に一致する名前の列を選択します。正規表現を使えば、接頭辞、接尾辞、数字の位置、複雑なパターンなどにも一致させられるため、like=より強力です。正規表現は列名のどこにでも一致し、先頭に固定されるわけではありません。

import pandas as pd

df = pd.DataFrame({
    'q1_revenue': [100],
    'q2_revenue': [200],
    'q1_cost': [40],
    'q2_cost': [60],
    'annual_total': [360]
})

# Select columns ending with '_revenue'
revenue_cols = df.filter(regex='_revenue$')
print(revenue_cols)
#    q1_revenue  q2_revenue
# 0         100         200

# Select columns starting with 'q' (quarter columns)
quarter_cols = df.filter(regex='^q')
print(quarter_cols.columns.tolist())
# ['q1_revenue', 'q2_revenue', 'q1_cost', 'q2_cost']

df.columnsに対するリスト内包表記

最大限の柔軟性が必要な場合は、df.columnsをリスト内包表記で反復処理し、任意のPython文字列メソッドを適用して列のリストを作成します。startswith、endswith、contains、文字列の長さの確認、または正規表現だけでは表現できないカスタムロジックにも対応できます。

import pandas as pd

df = pd.DataFrame({
    'age': [25, 30],
    'age_group': ['young', 'mid'],
    'income': [50000, 70000],
    'income_tax': [8000, 12000],
    'name': ['Alice', 'Bob']
})

# Select columns that start with 'income'
income_cols = [c for c in df.columns if c.startswith('income')]
print(df[income_cols])
#    income  income_tax
# 0   50000        8000
# 1   70000       12000

列名の接尾辞による選択

列のIndexに対するstr.endswith()メソッドは、サフィックスで列を選択する最も簡潔な方法です。PandasのIndexオブジェクトは.strアクセサーメソッドをサポートしているため、すべての列名に対して一度に文字列操作を適用し、その結果得られるブール配列を使ってDataFrameをスライスできます。

import pandas as pd

df = pd.DataFrame({
    'revenue_2022': [100],
    'cost_2022': [40],
    'revenue_2023': [150],
    'cost_2023': [55],
    'notes': ['ok']
})

# Use Index.str.endswith for suffix selection
cols_2023 = df.columns[df.columns.str.endswith('_2023')]
print(df[cols_2023])
#    revenue_2023  cost_2023
# 0           150         55

パターンで列を削除する

残す列を指定するよりも、列のセットを除外したほうが簡単な場合があります。パターンによる選択とdrop()を組み合わせるか、補集合を使用します。つまり、削除する列のリストを作成してからdf.drop(columns=cols_to_drop)を呼び出します。または、不要な列を取得してdropに渡すこともできます。

import pandas as pd

df = pd.DataFrame({
    'id': [1, 2],
    'name': ['A', 'B'],
    'temp_col1': [0, 0],
    'temp_col2': [0, 0],
    'score': [90, 80]
})

# Drop columns whose name starts with 'temp_'
temp_cols = [c for c in df.columns if c.startswith('temp_')]
cleaned = df.drop(columns=temp_cols)
print(cleaned)
#    id name  score
# 0   1    A     90
# 1   2    B     80

select_dtypesで数値列を選択する

名前のパターンではなく、特定のデータ型の列が必要な場合は、df.select_dtypes(include=)を使用します。include='number'を渡すとすべての数値列(intとfloat)が選択され、include='object'を渡すと文字列列が、include='datetime'を渡すとdatetime列が選択されます。

これは、数値の集約処理を適用する前に特に便利です。テキスト列に誤ってmean()を呼び出すことがありません。

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'age': [25, 30],
    'salary': [50000.0, 70000.0],
    'dept': ['Eng', 'HR']
})

# Select only numeric columns
numeric_df = df.select_dtypes(include='number')
print(numeric_df)
#    age   salary
# 0   25  50000.0
# 1   30  70000.0

# Exclude numeric columns
text_df = df.select_dtypes(exclude='number')
print(text_df)
#     name dept
# 0  Alice  Eng
# 1    Bob   HR

axis=0で行のIndexにfilter()を適用する

デフォルトでは、filter()は列(axis=1)に対して動作します。ただし、axis=0を渡すことで、インデックスラベルで行をフィルタリングすることもできます。これは、DataFrameに意味のある文字列のインデックスラベルがあり、インデックスラベルがパターンに一致する行を選択したい場合に便利です。あまり一般的ではありませんが、役立つテクニックです。

import pandas as pd

df = pd.DataFrame({
    'value': [10, 20, 30, 40]
}, index=['alpha_a', 'beta_b', 'alpha_c', 'gamma_d'])

# Filter rows by index label pattern
alpha_rows = df.filter(like='alpha', axis=0)
print(alpha_rows)
#          value
# alpha_a     10
# alpha_c     30

列選択パターンを組み合わせる

実際の列選択では、複数の方法を組み合わせることがよくあります。正規表現で基本となる列のセットを見つけ、その後リスト内包表記でさらに絞り込みます。列のリストを段階的に作成し、スライスする前に確認しておくと、必要な列を誤って削除したり不要な列を含めたりする、気づきにくいバグを防げます。

import pandas as pd

df = pd.DataFrame(columns=[
    'user_id', 'user_name', 'user_email',
    'product_id', 'product_name', 'product_price',
    'order_total', 'order_date'
])

# Step 1: columns that start with 'user_' or 'order_'
step1 = [c for c in df.columns if c.startswith('user_') or c.startswith('order_')]

# Step 2: exclude email (PII)
final_cols = [c for c in step1 if 'email' not in c]
print(final_cols)
# ['user_id', 'user_name', 'order_total', 'order_date']

パターンで列の順序を変更する

パターンによる選択は、列の順序変更にも役立ちます。まず必要な列(例:IDとメタデータ)を選択し、その後に残りの列を指定した順序で追加します。列の順序を整えるとDataFrameが読みやすくなり、出力の構造も一貫します。

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'metric_b': [1], 'metric_a': [2],
    'id': [10], 'label': ['x'],
    'metric_c': [3]
})

# Put id and label first, then sort metric columns alphabetically
id_cols = ['id', 'label']
metric_cols = sorted([c for c in df.columns if c.startswith('metric')])
ordered = df[id_cols + metric_cols]
print(ordered.columns.tolist())
# ['id', 'label', 'metric_a', 'metric_b', 'metric_c']

実践例:横長のアンケートデータ

パターン選択の典型的な用途は、各質問からq1_score、q1_text、q2_scoreなど複数の列が生成される横長のアンケートデータセットです。正規表現1つですべてのscore列を抽出して平均を計算し、分析用の列と自由記述の回答を分けて保持できます。

import pandas as pd

survey = pd.DataFrame({
    'respondent_id': [1, 2, 3],
    'q1_score': [4, 3, 5],
    'q2_score': [3, 4, 4],
    'q3_score': [5, 5, 3],
    'q1_comment': ['good', 'ok', 'great'],
    'q2_comment': ['fine', 'nice', 'meh']
})

# All score columns
score_cols = survey.filter(regex='_score$').columns
survey['avg_score'] = survey[score_cols].mean(axis=1)
print(survey[['respondent_id', 'avg_score']])
#    respondent_id  avg_score
# 0              1   4.000000
# 1              2   4.000000
# 2              3   4.000000

確認問題

パターンによる列選択についての理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、filter(like=)で部分文字列を含む列を選択する方法、filter(regex=)で正規表現を使って柔軟にパターンマッチングする方法、そしてdf.columnsに対するリスト内包表記とPythonの文字列メソッドで最大限柔軟に操作する方法を学びました。データ型で選択するにはselect_dtypes()を使用します。次は、DataFrame内の欠損値(NaN)の検出について学びます。

よくある質問

「パターンによる列の選択」レッスンは無料ですか?

はい。「パターンによる列の選択」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「パターンによる列の選択」で何を学びますか?

filter(like=)、filter(regex=)、リスト内包表記を使って、名前のパターンに一致する列を選択します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「パターンによる列の選択」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DataFrameのブールインデックス
  2. query()メソッド
  3. isin()とbetween()によるフィルタ
  4. パターンによる列の選択
← Pandas & NumPy Academyに戻る