Traffine I/O

日本語

2022-11-16

Pandasにおけるデータのフィルタリング

はじめに

この記事では、データ分析において重要な操作であるPandasにおけるデータフィルタリングの様々な技術について説明します。これらの技術をマスターすることで、効率的にデータを分析・操作することができます。

ブールインデックスを使用したフィルタリング

Pandas DataFrameにおいて、ブールインデックスはデータをフィルタリングするためのシンプルで強力なテクニックです。フィルタリングする条件を表すブールマスクを作成し、それを使用してデータを選択します。例えば、製品の情報が含まれるdfという名前のDataFrameがあるとし、価格が100以上の製品を除外したい場合は以下のように書きます。

python
price_filter = df['price'] > 100
filtered_df = df[price_filter]

queryメソッドを使用したフィルタリング

queryメソッドは、DataFrameにおけるデータフィルタリングに便利な方法の1つです。クエリ文字列を引数として渡し、指定された条件を満たす行を返します。同じ例で、価格が100以上の製品をフィルタリングする場合は以下のようになります。

python
filtered_df = df.query('price > 100')

フィルタの組み合わせ

データに複数のフィルタを適用する場合があります。論理演算子(&(and)または|(or))を使用して複数のフィルタを組み合わせることができます。例えば、価格が100以上で評価が4以上の製品をフィルタリングする場合は以下のようになります。

python
price_filter = df['price'] > 100
rating_filter = df['rating'] > 4
filtered_df = df[price_filter & rating_filter]

文字列パターンに基づくフィルタリング

Pandasは、文字列パターンに基づくフィルタリングもサポートしています。containsstartswith、またはendswithのような文字列メソッドをstrアクセサと組み合わせて使用します。例えば、"Laptop"という単語を含む名前の製品をフィルタリングするには以下のようになります。

python
name_filter = df['name'].str.contains('Laptop')
filtered_df = df[name_filter]

日時条件に基づくフィルタリング

Pandasは、日時条件に基づくフィルタリングを行うための堅牢なサポートを提供しています。DateTime列がある場合、特定の日付範囲や時間範囲に基づいてフィルタリングすることができます。例えば、2022年1月1日以降に作成されたレコードをフィルタリングする場合は以下のようになります。

python
date_filter = df['created_at'] > '2022-01-01'
filtered_df = df[date_filter]

また、betweenメソッドを使用して、特定の日付範囲内のデータをフィルタリングすることもできます。

python
date_filter = df['created_at'].between('2022-01-01', '2022-12-31')
filtered_df = df[date_filter]

isinメソッドの使用

isinメソッドは、値のリストに基づいてデータをフィルタリングするのに役立ちます。指定された列内の各要素が指定されたリストに含まれるかどうかをチェックし、ブールマスクを返します。例えば、カラム'category'を持つDataFrame dfがあり、'Electronics'と'Clothing'のカテゴリーに属する製品を除外したい場合は以下のようになります。

python
category_filter = df['category'].isin(['Electronics', 'Clothing'])
filtered_df = df[category_filter]

カスタム関数の適用

データをフィルタリングするためにカスタム関数を適用する必要がある場合があります。Pandasは、指定した軸(行または列)に沿ってカスタム関数を適用できるapplyメソッドを提供します。例えば、価格/評価比が20を超える製品を選択するためのカスタムフィルタを作成する場合は以下のようになります。

python
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'で始まる名前を持つ製品をフィルタリングする場合は以下のようになります。

python
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'がカテゴリーである全ての行を選択したい場合は以下のようになります。

python
filtered_df = df.xs('Electronics', level='category')

条件付き集計

条件付き集計を使用すると、特定の条件に基づいてデータのサブセットに対して集計関数を適用できます。例えば、評価が4以上の製品の平均価格を計算する場合は以下のようになります。

python
import numpy as np

rating_filter = df['rating'] > 4
average_price = np.mean(df.loc[rating_filter, 'price'])

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!