「グループごとに何かを計算したい」 場面では、pandas.groupby()
が使えます。
df.groupby(列名).処理
のように書くことで、指定した列の値でグループ分けして処理を行います。たとえば、df.groupby("カテゴリ").mean()
は「DataFrame型のオブジェクトdf
を、列カテゴリ
の値ごとにグループ分けして平均値をとる」処理をします。
演習
import pandas as pd
# データの読み込み
df = pd.read_csv("dataset/physical_measurement_clean.csv")
df
Name | Height | Weight | Club | |
---|---|---|---|---|
0 | 佐藤 | 172 | 53 | 野球部 |
1 | 田中 | 160 | 50 | 合唱部 |
2 | 鈴木 | 165 | 58 | 美術部 |
3 | 高橋 | 170 | 59 | 美術部 |
4 | 伊藤 | 166 | 54 | サッカー部 |
5 | 山本 | 156 | 51 | 所属なし |
6 | 渡辺 | 163 | 58 | 所属なし |
さっそく部活ごとの身長と体重の平均値を計算してみましょう。 df.groupby(列名).処理
のように書くことで、指定した列の値でグループ分けして処理を行います。今回は平均値を出したいため、処理
の部分にはmean()
を使いましょう。
下記のコードを実行すると、部活ごとの身長・体重の平均値がDataFrame型のオブジェクトで得られます。なお、文字列が格納されている列Name
は平均値を計算できないため、自動的に無視されます。
# 列Clubのグループごとに、各列の平均値を計算
mean_df= df.groupby("Club").mean()
mean_df
Height | Weight | |
---|---|---|
Club | ||
サッカー部 | 166.0 | 54.0 |
合唱部 | 160.0 | 50.0 |
所属なし | 159.5 | 54.5 |
美術部 | 167.5 | 58.5 |
野球部 | 172.0 | 53.0 |
次に、部活ごとの最大値を確認してみましょう。mean()
の代わりにmax()
を適用すると、各列の最大値が得られます。
# 列Clubのグループごとに、各列の最大値を計算
max_df = df.groupby("Club").max()
max_df
Out[3]:
Name | Height | Weight | |
---|---|---|---|
Club | |||
サッカー部 | 伊藤 | 166 | 54 |
合唱部 | 田中 | 160 | 50 |
所属なし | 渡辺 | 163 | 58 |
美術部 | 高橋 | 170 | 59 |
野球部 | 佐藤 | 172 | 53 |
コメント