[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
複数列でのグループ化
複数の列を基準にデータをグループ化することも可能です。
以下の例では、category
とsub_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関数
と組み合わせることで、より強力なデータ分析が可能になります。
ここでは、agg
、transform
、agg関数
との組み合わせや、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が含まれる場合、主に以下の理由が考えられます。
- 元のデータにNaNが含まれている。
- 集計関数の結果が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を考慮します)。
グループ化後にデータが正しく集計されない場合
グループ化後にデータが正しく集計されない場合、主に以下の理由が考えられます。
- グループ化のキーが正しく指定されていない。
- 集計関数が適切でない。
以下の例では、グループ化のキーを誤って指定したため、期待した結果が得られません。
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関数
を積極的に活用し、より効率的なデータ処理を行ってみてください。