特定のグループごとに計算をするgroupbyの計算方法
groupbyの計算方法
1つの計算方法のみを出力する場合
kaggleのタイタニックのデータセットをもとに説明します。
性別の平均年齢を知りたい場合…
import pandas as pd
TRAIN = pd.read_csv('train.csv')
TRAIN_groupby = TRAIN[['Sex','Age']].groupby(['Sex']).mean()
# Age
# Sex
# female 27.915709
# male 30.726645「TRAIN[[‘Sex’,’Age’]]」でグループ分けのカラムと集計したいカラムを残します。
「.groupby([‘Sex’])」で性別でグループ分けをし、「.mean()」で平均を出します。
| sum | 合計 |
| mean | 平均 |
| median | 中央値 |
| std | 標準偏差 |
| min | 最小値 |
| max | 最大値 |
| count | Nullを除いた個数 |
| size | Nullを含めた個数 |
| describe | 統計量 |
複数の軸で複数の計算をする方法
PclassとSexでグループ分けをしてそれぞれの年齢について集計したい場合、
TRAIN = pd.read_csv('train.csv')
TRAIN_groupby = TRAIN[['Pclass','Sex','Age']].groupby(['Pclass','Sex']).agg(['mean','median','size'])| Age | ||||
|---|---|---|---|---|
| mean | median | size | ||
| Pclass | Sex | |||
| 1 | female | 34.611765 | 35.0 | 94 |
| male | 41.281386 | 40.0 | 122 | |
| 2 | female | 28.722973 | 28.0 | 76 |
| male | 30.740707 | 30.0 | 108 | |
| 3 | female | 21.750000 | 21.5 | 144 |
| male | 26.507589 | 25.0 | 347 | |
「.groupby([‘Pclass’,’Sex’])」で乗客クラスと性別でグループ分けします。
複数の集計をしたい場合は「.agg([****])」でまとめます。
統計量を一気に確認したい場合はdescribeも使えます
TRAIN_groupby = TRAIN[['Pclass','Sex','Age']].groupby(['Pclass','Sex']).agg(['describe'])| Age | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| describe | |||||||||
| count | mean | std | min | 25% | 50% | 75% | max | ||
| Pclass | Sex | ||||||||
| 1 | female | 85.0 | 34.611765 | 13.612052 | 2.00 | 23.000 | 35.0 | 44.00 | 63.0 |
| male | 101.0 | 41.281386 | 15.139570 | 0.92 | 30.000 | 40.0 | 51.00 | 80.0 | |
| 2 | female | 74.0 | 28.722973 | 12.872702 | 2.00 | 22.250 | 28.0 | 36.00 | 57.0 |
| male | 99.0 | 30.740707 | 14.793894 | 0.67 | 23.000 | 30.0 | 36.75 | 70.0 | |
| 3 | female | 102.0 | 21.750000 | 12.729964 | 0.75 | 14.125 | 21.5 | 29.75 | 63.0 |
| male | 253.0 | 26.507589 | 12.159514 | 0.42 | 20.000 | 25.0 | 33.00 | 74.0 | |
マルチインデックス、マルチカラムの解除方法
groupbyで集計すると、インデックスやカラムが複数存在するマルチインデックス、マルチカラムの形で出力されます。これを通常のテーブルの形に直す方法について。
TRAIN_groupby = TRAIN[['Pclass','Sex','Age']].groupby(['Pclass','Sex']).agg(['mean','median','size'])
TRAIN_groupby.columns = TRAIN_groupby.columns.droplevel(0)
TRAIN_groupby = TRAIN_groupby.reset_index()| Pclass | Sex | mean | median | size | |
|---|---|---|---|---|---|
| 0 | 1 | female | 34.611765 | 35.0 | 94 |
| 1 | 1 | male | 41.281386 | 40.0 | 122 |
| 2 | 2 | female | 28.722973 | 28.0 | 76 |
| 3 | 2 | male | 30.740707 | 30.0 | 108 |
| 4 | 3 | female | 21.750000 | 21.5 | 144 |
| 5 | 3 | male | 26.507589 | 25.0 | 347 |
「.columns.droplevel(0)」でマルチカラムを解除します。3つ以上のマルチカラムの場合は.droplevel(0)を重ねて「.columns.droplevel(0).droplevel(0)」で解除できます。
また、「.reset_index()」でマルチインデックスを解除できます。

