Pandasは、データ操作と分析のための強力なPythonライブラリです。その最も頻繁に使用される機能の1つは、データをグループ化して集計計算を実行する機能です。この記事では、groupby()
メソッドを使用してデータをグループ化した後の集計合計を効率的に計算するための様々な方法を解説し、複雑さと目的の出力形式の異なるソリューションを提供します。
目次:
groupby()
を使った基本的な合計agg()
を使った複数集計apply()
を使ったカスタム集計groupby()
とcumsum()
を使った累積合計pivot_table()
を使ったデータの整形
groupby()
を使った基本的な合計
グループ化した後の列の合計を計算する最も簡単な方法は、sum()
メソッドと直接groupby()
を使用することです。
import pandas as pd
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
# 'Group'でグループ化し、'Value'を合計
grouped_sum = df.groupby('Group')['Value'].sum()
print(grouped_sum)
これにより、各グループの’Value’の合計をまとめたSeriesが簡潔に生成されます。
agg()
を使った複数集計
agg()
メソッドを使用すると、複数の集計統計を同時に効率的に計算できます。これは、合計以上のものが必要な場合に特に役立ちます。
import pandas as pd
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
# 各グループの合計、平均、カウントを計算
aggregated = df.groupby('Group')['Value'].agg(['sum', 'mean', 'count'])
print(aggregated)
この1行のコードで、各グループの’Value’の合計、平均、カウントが計算され、DataFrameになります。
apply()
を使ったカスタム集計
カスタム集計ロジックが必要なより複雑なシナリオの場合、apply()
メソッドは最大限の柔軟性を提供します。任意の計算を実行する関数を定義できます。
import pandas as pd
import numpy as np
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
def custom_agg(x):
return pd.Series({'sum': x.sum(), 'range': x.max() - x.min()})
# カスタム集計関数の適用
result = df.groupby('Group')['Value'].apply(custom_agg).reset_index()
print(result)
ここでは、カスタム関数が各グループの合計と範囲の両方を計算します。
groupby()
とcumsum()
を使った累積合計
各グループ内の累積合計を取得するには、groupby()
とcumsum()
メソッドを組み合わせます。
import pandas as pd
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
# 各グループの累積合計を計算
df['Cumulative Sum'] = df.groupby('Group')['Value'].cumsum()
print(df)
これにより、各グループ内の累積合計を示す新しい列が追加されます。
pivot_table()
を使ったデータの整形
特に複数のグループ化変数を扱う場合、集計データの視覚的に魅力的で分析しやすい表現を得るには、pivot_table()
を使用します。
import pandas as pd
data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
'Category': ['X', 'Y', 'X', 'Y', 'Z', 'X'],
'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)
pivot_table = pd.pivot_table(df, values='Value', index='Group', columns='Category', aggfunc='sum', fill_value=0)
print(pivot_table)
これにより、データを要約したピボットテーブルが作成され、各グループ内の異なるカテゴリ間で合計を比較しやすくなります。