Pandas GroupBy入門:データをグループ化して効率的に処理する方法

データ分析では、データをグループ化することがよくあります。例えば、ある商品の販売データを日付や地域ごとにグループ化して、平均販売個数や合計売上高を算出するといった処理が挙げられます。Pandasには、このようなデータのグループ化を行うためのGroupBy機能があります。

Pandas GroupByの概要とメリット

PandasのGroupBy機能は、SQLのGROUP BY句に相当する機能で、データを指定したキーでグループ化して、各グループに対して集計処理を行うことができます。

例えば、以下のような販売データがあるとします。

import pandas as pd

df = pd.DataFrame({
    'date': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-01', '2022-01-02', '2022-01-03'],
    'region': ['Tokyo', 'Tokyo', 'Tokyo', 'Osaka', 'Osaka', 'Osaka'],
    'item': ['A', 'A', 'B', 'A', 'B', 'B'],
    'sales': [10, 20, 30, 15, 25, 35]
})

print(df)

このデータを、日付ごとにグループ化して、各日付ごとに売上高の平均を算出するには、GroupBy機能を使います。

grouped = df.groupby('date')
result = grouped.mean()
print(result)

この結果は以下のようになります。

            sales
date             
2022-01-01   12.5
2022-01-02   22.5
2022-01-03   32.5

このように、GroupBy機能を使うことで、グループごとに処理を行うことができます。

また、GroupBy機能によって、データの集計処理をより効率的に行うことができます。従来のforループによる集計処理は、データ量が多い場合には非常に遅くなりますが、GroupBy機能を使うことで、高速かつ効率的な集計処理を行うことが可能です。

GroupByオブジェクトの生成方法

GroupBy機能を使うには、まずGroupByオブジェクトを生成する必要があります。

GroupByオブジェクトは、データフレームの列を指定して生成します。以下は、上記の販売データを日付ごとにグループ化する例です。

grouped = df.groupby('date')

このように、groupbyメソッドに列名を指定することで、GroupByオブジェクトを生成することができます。

グループごとの基本的な統計量の算出

GroupByオブジェクトを生成したら、次にグループごとの基本的な統計量を算出することができます。

例えば、グループごとの平均値を算出するには、meanメソッドを使います。

result = grouped.mean()

他にも、以下のような統計量を算出することができます。

  • 合計値:sumメソッド
  • 最大値:maxメソッド
  • 最小値:minメソッド
  • 中央値:medianメソッド
  • 分散:varメソッド
  • 標準偏差:stdメソッド

これらのメソッドは、GroupByオブジェクトに対して直接適用することができます。

カスタム集計関数の適用方法

基本的な統計量以外にも、独自の集計関数を適用することができます。

例えば、グループごとに2倍した値を算出する関数を作成し、GroupByオブジェクトに適用する場合は、以下のようにします。

def double(x):
    return x * 2

result = grouped.agg(double)

aggメソッドに適用したい関数を渡すことで、独自の集計処理を行うことができます。

複数列を用いたグループ化と複数の統計量の算出

GroupBy機能を使う際には、複数の列を指定してグループ化することもできます。

例えば、以下のような販売データがある場合を考えます。

import pandas as pd

df = pd.DataFrame({
'date': ['2022-01-01', '2022-01-01', '2022-01-02', '2022-01-02', '2022-01-03', '2022-01-03'],
'region': ['Tokyo', 'Osaka', 'Tokyo', 'Osaka', 'Tokyo', 'Osaka'],
'item': ['A', 'A', 'B', 'B', 'C', 'C'],
'sales': [10, 15, 20, 25, 30, 35]
})

print(df)

このデータを、日付と地域ごとにグループ化して、売上高の平均値と合計値を算出するには、以下のようにします。

grouped = df.groupby(['date', 'region'])
result = grouped.agg(['mean', 'sum'])
print(result)

この結果は以下のようになります。

                   sales    
                    mean sum
date       region          
2022-01-01 Osaka   15.0  15
           Tokyo   10.0  10
2022-01-02 Osaka   25.0  25
           Tokyo   20.0  20
2022-01-03 Osaka   35.0  35
           Tokyo   30.0  30

複数の列を指定してグループ化する場合は、groupbyメソッドに列名のリストを渡します。また、複数の統計量を算出する場合は、aggメソッドに統計量のリストを渡します。

GroupByオブジェクトを用いたデータ変換・欠損値処理

GroupBy機能は、データ変換や欠損値処理にも利用することができます。

例えば、以下のような販売データがある場合を考えます。

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'date': ['2022-01-01', '2022-01-01', '2022-01-02', '2022-01-02', '2022-01-03', '2022-01-03'],
    'region': ['Tokyo', 'Osaka', 'Tokyo', 'Osaka', 'Tokyo', 'Osaka'],
    'item': ['A', 'A', 'B', 'B', 'C', 'C'],
    'sales': [10, 15, 20, np.nan, 30, 35]
})

print(df)

このデータに対して、欠損値を各グループの平均値で補完する場合は、以下のようにします。

grouped = df.groupby(['date'])
result = grouped.transform(lambda x: x.fillna(x.mean()))

print(result)

この結果は以下のようになります。

   sales
0   10.0
1   15.0
2   20.0
3   20.0
4   30.0
5   35.0

transformメソッドに、各グループの欠損値を補完するための関数を渡すことで、欠損値を補完することができます。

まとめ

PandasのGroupBy機能を使うことで、データをグループ化して効率的に処理することができます。GroupByオブジェクトを生成し、グループごとの基本的な統計量や独自の集計関数を算出することができます。また、複数の列を指定してグループ化したり、欠損値処理を行ったりすることもできます。

データ分析では、データをグループ化することが非常に重要な処理の一つです。PandasのGroupBy機能を使いこなすことで、より効率的なデータ分析を行うことができます。