📈

pandasのdataframeでgroup byして複数の統計値を取得する

2022/08/11に公開

例えば以下の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()を使う。
こちらの記事にありました。
https://note.nkmk.me/python-pandas-agg-aggregate/

この様にまとめて集計できるます。

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