Pandas

[Python] Pandas – 集計できるgroupby関数の使い方

Pandasのgroupby関数は、データを特定の列や条件でグループ化し、集計や操作を行うために使用されます。

groupbyは、SQLのGROUP BYに似た機能を提供します。

基本的な使い方は、DataFrameの特定の列を基準にグループ化し、その後に集計関数(例:sum()mean()count()など)を適用します。

例えば、df.groupby('列名').sum()のように使用します。

複数列でグループ化する場合は、リストで列名を指定します。

groupby関数とは

Pandasのgroupby関数は、データフレームを特定の列に基づいてグループ化し、各グループに対して集計や変換を行うための強力なツールです。

この関数を使用することで、大量のデータを効率的に分析し、洞察を得ることができます。

groupbyの基本的な概念

groupby関数は、データを特定のキー(列)でグループ化し、各グループに対して集計関数を適用することができます。

これにより、データの要約や分析が容易になります。

基本的な流れは以下の通りです。

  • データをグループ化するキーを指定
  • 各グループに対して集計関数を適用
  • 結果を新しいデータフレームとして取得

SQLのGROUP BYとの違い

groupby関数は、SQLのGROUP BY句と似た機能を持っていますが、いくつかの違いがあります。

特徴groupby関数SQLのGROUP BY
データ構造Pandasデータフレームテーブル
集計関数の適用複数の集計関数を同時に適用可能一度に一つの集計関数のみ
結果の形式データフレームテーブル
フィルタリング機能グループ化後にフィルタ可能GROUP BY後のHAVING句でフィルタ

groupbyの主な用途

groupby関数は、以下のような用途で広く使用されます。

  • データの要約:特定のカテゴリごとの合計や平均を計算する。
  • データの分析:異なるグループ間の比較を行う。
  • データの可視化:グループごとのデータを視覚的に表現するための準備を行う。
  • データの前処理:機械学習モデルのトレーニングに向けたデータの整形。

groupby関数の基本的な使い方

groupby関数を使用することで、データを簡単にグループ化し、集計を行うことができます。

ここでは、基本的な使い方を具体的な例を交えて解説します。

単一列でのグループ化

単一の列を基準にデータをグループ化する方法です。

以下のサンプルコードでは、category列でデータをグループ化し、各グループの合計を計算します。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 単一列でのグループ化
grouped = df.groupby('category').sum()
print(grouped)
          value
category       
A            90
B            60

複数列でのグループ化

複数の列を基準にデータをグループ化することも可能です。

以下の例では、categorysub_categoryの2つの列でグループ化し、合計を計算します。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'sub_category': ['X', 'Y', 'Y', 'X', 'X'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 複数列でのグループ化
grouped = df.groupby(['category', 'sub_category']).sum()
print(grouped)
                       value
category sub_category       
A        X                60
         Y                30
B        X                40
         Y                20

グループ化後の集計関数の適用

グループ化したデータに対して、さまざまな集計関数を適用することができます。

sum()関数での集計

sum()関数を使用して、各グループの合計を計算します。

grouped_sum = df.groupby('category').sum()
print(grouped_sum)
value
category       
A            90
B            60

mean()関数での集計

mean()関数を使用して、各グループの平均を計算します。

grouped_mean = df.groupby('category').mean()
print(grouped_mean)
value
category       
A            30
B            30

count()関数での集計

count()関数を使用して、各グループの要素数を計算します。

grouped_count = df.groupby('category').count()
print(grouped_count)
value
category       
A            3
B            2

max()、min()関数での集計

max()関数min()関数を使用して、各グループの最大値と最小値を計算します。

grouped_max = df.groupby('category').max()
grouped_min = df.groupby('category').min()
print(grouped_max)
print(grouped_min)
value
category       
A            50
B            40
          value
category       
A            10
B            20

グループ化後のデータフレームの構造

groupby関数を使用した後のデータフレームは、インデックスがグループ化したキーに設定されます。

これにより、各グループの集計結果が見やすくなります。

グループ化されたデータフレームは、通常のデータフレームと同様に操作できますが、インデックスがグループ化されたキーであることを考慮する必要があります。

groupby関数の応用

groupby関数は、基本的な集計だけでなく、さまざまな応用が可能です。

ここでは、複数の集計関数の同時適用やカスタム集計関数の使用、データのフィルタリング、変換、ソートについて解説します。

複数の集計関数を同時に適用する

agg()メソッドを使用することで、複数の集計関数を同時に適用することができます。

以下の例では、sum()mean()を同時に計算します。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# 複数の集計関数を同時に適用
grouped = df.groupby('category').agg(['sum', 'mean'])
print(grouped)
value       
           sum mean
category            
A            90  30.0
B            60  30.0

カスタム集計関数の適用

独自の集計関数を定義して、agg()メソッドで適用することも可能です。

以下の例では、カスタム関数を使用して、合計と標準偏差を計算します。

import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# カスタム集計関数の定義
def custom_std(series):
    return np.std(series)
# カスタム集計関数を適用
grouped = df.groupby('category').agg(['sum', custom_std])
print(grouped)
         value
           sum custom_std
category
A           90  16.329932
B           60  10.000000

グループごとのデータにフィルタをかける

filter()メソッドを使用することで、特定の条件を満たすグループのみを抽出することができます。

以下の例では、合計が40以上のグループをフィルタリングします。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# グループごとのデータにフィルタをかける
filtered = df.groupby('category').filter(lambda x: x['value'].sum() >= 40)
print(filtered)
  category  value
0        A     10
1        B     20
2        A     30
3        B     40
4        A     50

グループごとのデータに対する変換

transform()メソッドを使用することで、グループごとのデータに対して変換を行うことができます。

以下の例では、各値をグループの平均で割ることで、標準化を行います。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# グループごとのデータに対する変換
df['normalized'] = df.groupby('category')['value'].transform(lambda x: x / x.mean())
print(df)
  category  value  normalized
0        A     10    0.333333
1        B     20    0.666667
2        A     30    1.000000
3        B     40    1.333333
4        A     50    1.666667

グループごとのデータに対するソート

グループ化したデータをソートすることも可能です。

以下の例では、value列の合計に基づいてグループをソートします。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# グループごとのデータに対するソート
grouped = df.groupby('category').sum().sort_values(by='value', ascending=False)
print(grouped)
value
category       
A            90
B            60

これらの応用を活用することで、groupby関数を使ったデータ分析がより柔軟かつ強力になります。

groupby関数と他のPandas関数の組み合わせ

groupby関数は、他のPandas関数と組み合わせることで、より強力なデータ分析が可能になります。

ここでは、aggtransformagg関数との組み合わせや、pivot_table関数との違いについて解説します。

groupbyとagg関数の組み合わせ

agg()メソッドは、グループ化したデータに対して複数の集計関数を同時に適用するために使用されます。

以下の例では、sum()mean()を同時に計算します。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# groupbyとagg関数の組み合わせ
grouped = df.groupby('category').agg(['sum', 'mean'])
print(grouped)
         value      
           sum  mean
category
A           90  30.0
B           60  30.0

このように、agg()を使うことで、複数の集計結果を一度に得ることができます。

groupbyとtransform関数の組み合わせ

transform()メソッドは、グループごとのデータに対して変換を行い、元のデータフレームと同じ形状のデータを返します。

以下の例では、各値をグループの平均で割ることで、標準化を行います。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)
# groupbyとtransform関数の組み合わせ
df['normalized'] = df.groupby('category')['value'].transform(lambda x: x / x.mean())
print(df)
  category  value  normalized
0        A     10    0.333333
1        B     20    0.666667
2        A     30    1.000000
3        B     40    1.333333
4        A     50    1.666667

このように、transform()を使うことで、グループごとの計算結果を元のデータフレームに追加することができます。

groupbyとagg関数の組み合わせ

agg()メソッドは、グループごとに指定した集計関数を適用するために使用されます。

以下の例では、各グループの最大値と最小値を計算するためにaggを使用します。

import pandas as pd

# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)

# groupbyとagg関数の組み合わせ
grouped = df.groupby('category')['value'].agg(max='max', min='min')

print(grouped)
          max  min
category
A          50   10
B          40   20

このように、agg()を使うことで、指定した集計関数を簡潔にグループごとに実行することができます。

aggは、複数の集計操作を一度に行うことができ、コードの可読性を向上させます。

groupbyとpivot_table関数の違いと使い分け

pivot_table関数は、データをピボット形式で集計するための関数です。

groupbyと似た機能を持っていますが、いくつかの違いがあります。

特徴groupby関数pivot_table関数
データの形状グループ化したデータフレームピボット形式のデータフレーム
集計関数の適用複数の集計関数を同時に適用可能複数の集計関数を同時に適用可能
インデックスの設定グループ化したキーがインデックス行と列のインデックスを指定可能
NaNの処理デフォルトでNaNを含むfill_valueでNaNを置き換え可能

groupbyは、データの集計や要約に適しており、pivot_tableは、データを視覚的に整理するために便利です。

具体的な用途に応じて使い分けることが重要です。

実践例:groupbyを使ったデータ分析

groupby関数を活用することで、さまざまなデータ分析が可能です。

ここでは、売上データの集計、顧客データの分析、時系列データのグループ化と集計、カテゴリ別の統計量の算出について具体的な例を示します。

売上データの集計

売上データを集計することで、各商品の売上合計や平均を把握することができます。

以下の例では、商品ごとの売上合計を計算します。

import pandas as pd
# サンプル売上データの作成
data = {
    'product': ['A', 'B', 'A', 'C', 'B', 'A'],
    'sales': [100, 200, 150, 300, 250, 400]
}
df = pd.DataFrame(data)
# 売上データの集計
sales_summary = df.groupby('product')['sales'].sum()
print(sales_summary)
product
A    650
B    450
C    300
Name: sales, dtype: int64

この結果から、商品Aの売上が最も高いことがわかります。

顧客データの分析

顧客データを分析することで、顧客ごとの購入回数や平均購入金額を把握できます。

以下の例では、顧客ごとの購入回数と平均購入金額を計算します。

import pandas as pd
# サンプル顧客データの作成
data = {
    'customer_id': [1, 2, 1, 3, 2, 1],
    'purchase_amount': [100, 200, 150, 300, 250, 400]
}
df = pd.DataFrame(data)
# 顧客データの分析
customer_summary = df.groupby('customer_id').agg({'purchase_amount': ['count', 'mean']})
print(customer_summary)
            purchase_amount
                      count        mean
customer_id
1                         3  216.666667
2                         2  225.000000
3                         1  300.000000

この結果から、顧客1が最も多く購入していることがわかります。

時系列データのグループ化と集計

時系列データをグループ化することで、特定の期間ごとの集計が可能です。

以下の例では、日付ごとの売上合計を計算します。

import pandas as pd
# サンプル時系列データの作成
data = {
    'date': pd.to_datetime(['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-03']),
    'sales': [100, 200, 150, 300, 250]
}
df = pd.DataFrame(data)
# 日付ごとの売上合計を計算
daily_sales = df.groupby('date')['sales'].sum()
print(daily_sales)
date
2023-01-01    300
2023-01-02    450
2023-01-03    250
Name: sales, dtype: int64

この結果から、2023年1月2日の売上が最も高いことがわかります。

カテゴリ別の統計量の算出

カテゴリ別に統計量を算出することで、各カテゴリの特性を把握できます。

以下の例では、商品カテゴリごとの売上の平均と標準偏差を計算します。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A', 'C'],
    'sales': [100, 200, 150, 300, 250, 400]
}
df = pd.DataFrame(data)
# カテゴリ別の統計量の算出
category_stats = df.groupby('category')['sales'].agg(['mean', 'std'])
print(category_stats)
                mean        std
category
A         166.666667  76.376262
B         250.000000  70.710678
C         400.000000        NaN

この結果から、カテゴリAの売上の平均が166.67で、標準偏差が75であることがわかります。

カテゴリCはデータが1つしかないため、標準偏差はNaNとなります。

これらの実践例を通じて、groupby関数を使ったデータ分析の具体的な方法を理解することができます。

よくあるエラーとその対処法

groupby関数を使用する際に遭遇する可能性のあるエラーや問題について、具体的な原因とその対処法を解説します。

KeyErrorが発生する場合

KeyErrorは、指定した列名がデータフレームに存在しない場合に発生します。

例えば、以下のようなコードでKeyErrorが発生することがあります。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B'],
    'value': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
# 存在しない列名でgroupbyを試みる
grouped = df.groupby('non_existent_column').sum()

この場合、non_existent_columnという列名がデータフレームに存在しないため、KeyErrorが発生します。

対処法:

  • 使用する列名が正しいか確認する。
  • 列名のスペルミスや大文字小文字の違いに注意する。
  • df.columnsを使って、データフレームの列名を確認する。

groupby後にNaNが含まれる場合

groupbyを使用した後にNaNが含まれる場合、主に以下の理由が考えられます。

  1. 元のデータにNaNが含まれている。
  2. 集計関数の結果がNaNになる場合(例えば、全ての値がNaNのグループ)。

以下の例では、元のデータにNaNが含まれているため、集計結果にもNaNが含まれます。

import pandas as pd
import numpy as np
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B', 'A'],
    'value': [10, np.nan, 30, 40, np.nan]
}
df = pd.DataFrame(data)
# groupby後にNaNが含まれる
grouped = df.groupby('category')['value'].sum()
print(grouped)
category
A    40.0
B    40.0
Name: value, dtype: float64

この場合、カテゴリAの合計は40.0ですが、NaNが含まれているため、NaNが無視されて計算されています。

対処法:

  • 元のデータにNaNが含まれている場合、dropna()メソッドを使用してNaNを除去する。
  • 集計関数を適用する際に、NaNをどのように扱うかを考慮する(例えば、sum()はNaNを無視しますが、mean()はNaNを考慮します)。

グループ化後にデータが正しく集計されない場合

グループ化後にデータが正しく集計されない場合、主に以下の理由が考えられます。

  1. グループ化のキーが正しく指定されていない。
  2. 集計関数が適切でない。

以下の例では、グループ化のキーを誤って指定したため、期待した結果が得られません。

import pandas as pd
# サンプルデータの作成
data = {
    'category': ['A', 'B', 'A', 'B'],
    'value': [10, 20, 30, 40]
}
df = pd.DataFrame(data)
# 誤ったキーでgroupbyを試みる
grouped = df.groupby('wrong_key')['value'].sum()

この場合、wrong_keyという列名は存在しないため、KeyErrorが発生します。

対処法:

  • グループ化のキーが正しいか確認する。
  • 使用する集計関数がデータの特性に合っているか確認する。
  • データの内容を確認し、期待する結果が得られるように集計関数を選択する。

これらのエラーや問題に対処することで、groupby関数をより効果的に活用できるようになります。

まとめ

この記事では、Pandasのgroupby関数を使ったデータ分析の基本から応用までを詳しく解説しました。

具体的には、データの集計方法や、他のPandas関数との組み合わせ、実践的なデータ分析の例を通じて、groupbyの活用方法を紹介しました。

これを機に、実際のデータ分析においてgroupby関数を積極的に活用し、より効率的なデータ処理を行ってみてください。

関連記事

Back to top button