📈
pandasのdataframeでgroup byして複数の統計値を取得する
例えば以下のdataframeがあるとします
df
df = pd.DataFrame(
{
'name': ['ヤシュトラ','ヤシュトラ','ナシュ','ナシュ','ナシュ'],
'point': [100,200, 300, 400, 500],
}
)
このdfからnameごとのpoint合計を集計する場合、私はいつもsum()
を使ってました。
df.groupby('name').sum()
結果
name | point |
---|---|
ヤシュトラ | 300 |
ナシュ | 1200 |
合計以外にカウント数や平均を求める場合はcount()
やmean()
を使えば良いのですがカウント数と平均を同時に求める場合は以下のように複数回groupbyしてからmergeしてました。
df_sum = df.groupby('name').sum()
df_mean = df.groupby('name').mean()
pd.merge(df_sum, df_mean, on='name')
groupbyを一回にまとめる
解決方法はagg()
を使う。
こちらの記事にありました。
この様にまとめて集計できるます。
df_gb = df.groupby('name').agg(['count', 'sum', 'mean'])
結果
まとめることが出来ました!!
ですがカラム名がネスト構造??になってて手直ししたいと思います。
### 変更前
print(df_gb.columns)
MultiIndex([('point', 'count'),
('point', 'sum'),
('point', 'mean')],
)
変更する場合は配列で渡してあげればよいようです。
df_gb.columns = ['count','sum', 'mean']
print(df_gb.columns)
Index(['count', 'sum', 'mean'], dtype='object')
手直し完了!
Discussion