はじめに
この記事では、データ分析において重要な操作であるPandasにおけるデータフィルタリングの様々な技術について説明します。これらの技術をマスターすることで、効率的にデータを分析・操作することができます。
ブールインデックスを使用したフィルタリング
Pandas DataFrameにおいて、ブールインデックスはデータをフィルタリングするためのシンプルで強力なテクニックです。フィルタリングする条件を表すブールマスクを作成し、それを使用してデータを選択します。例えば、製品の情報が含まれるdf
という名前のDataFrameがあるとし、価格が100以上の製品を除外したい場合は次のように書きます。
price_filter = df['price'] > 100
filtered_df = df[price_filter]
queryメソッドを使用したフィルタリング
query
メソッドは、DataFrameにおけるデータフィルタリングに便利な方法の1つです。クエリ文字列を引数として渡し、指定された条件を満たす行を返します。同じ例で、価格が100以上の製品をフィルタリングする場合は次のようになります。
filtered_df = df.query('price > 100')
フィルタの組み合わせ
データに複数のフィルタを適用する場合があります。論理演算子(&
(and)または|
(or))を使用して複数のフィルタを組み合わせることができます。例えば、価格が100以上で評価が4以上の製品をフィルタリングする場合は次のようになります。
price_filter = df['price'] > 100
rating_filter = df['rating'] > 4
filtered_df = df[price_filter & rating_filter]
文字列パターンに基づくフィルタリング
Pandasは、文字列パターンに基づくフィルタリングもサポートしています。contains
、startswith
、またはendswith
のような文字列メソッドをstr
アクセサと組み合わせて使用します。例えば、"Laptop"という単語を含む名前の製品をフィルタリングするには次のようになります。
name_filter = df['name'].str.contains('Laptop')
filtered_df = df[name_filter]
日時条件に基づくフィルタリング
Pandasは、日時条件に基づくフィルタリングを行うための堅牢なサポートを提供しています。DateTime列がある場合、特定の日付範囲や時間範囲に基づいてフィルタリングすることができます。例えば、2022年1月1日以降に作成されたレコードをフィルタリングする場合は次のようになります。
date_filter = df['created_at'] > '2022-01-01'
filtered_df = df[date_filter]
また、between
メソッドを使用して、特定の日付範囲内のデータをフィルタリングすることもできます。
date_filter = df['created_at'].between('2022-01-01', '2022-12-31')
filtered_df = df[date_filter]
isinメソッドの使用
isin
メソッドは、値のリストに基づいてデータをフィルタリングするのに役立ちます。指定された列内の各要素が指定されたリストに含まれるかどうかをチェックし、ブールマスクを返します。例えば、カラム'category'を持つDataFrame df
があり、'Electronics'と'Clothing'のカテゴリーに属する製品を除外したい場合は次のようになります。
category_filter = df['category'].isin(['Electronics', 'Clothing'])
filtered_df = df[category_filter]
カスタム関数の適用
データをフィルタリングするためにカスタム関数を適用する必要がある場合があります。Pandasは、指定した軸(行または列)に沿ってカスタム関数を適用できるapply
メソッドを提供します。例えば、価格/評価比が20を超える製品を選択するためのカスタムフィルタを作成する場合は次のようになります。
def price_to_rating_ratio(row):
return row['price'] / row['rating'] > 20
ratio_filter = df.apply(price_to_rating_ratio, axis=1)
filtered_df = df[ratio_filter]
正規表現を使用したフィルタリング
Pandasは、正規表現を使用してデータをフィルタリングすることもサポートしています。str
アクセサとmatch
メソッドを組み合わせて、列に正規表現パターンを適用します。例えば、'Laptop'で始まる名前を持つ製品をフィルタリングする場合は次のようになります。
import re
name_filter = df['name'].str.match(r'^Laptop')
filtered_df = df[name_filter]
Multi-Index DataFrameにおけるフィルタリング
Multi-level indexを持つDataFrameがある場合、xs
メソッドを使用して特定のインデックスレベルに基づいてデータをフィルタリングすることができます。例えば、'category'と'sub_category'がインデックスレベルであるMulti-index DataFrameがある場合、'Electronics'がカテゴリーである全ての行を選択したい場合は次のようになります。
filtered_df = df.xs('Electronics', level='category')
条件付き集計
条件付き集計を使用すると、特定の条件に基づいてデータのサブセットに対して集計関数を適用できます。例えば、評価が4以上の製品の平均価格を計算する場合は次のようになります。
import numpy as np
rating_filter = df['rating'] > 4
average_price = np.mean(df.loc[rating_filter, 'price'])