Pandasのデータフレームをある列の値でグループ分けしたときに、そのグループごとに他の列の最大値を抽出する方法について。
具体的にどういうことをしたいのか?
たとえば、下記のようなデータフレームがあったとする。A | B |
---|---|
abc | 100 |
abc | 20 |
xyz | 30 |
abc | 50 |
xyz | 120 |
xyz | 60 |
このとき、A列を"abc"と"xyz"にグループ分けしたときに、B列の最大の値を抽出したい。
この例の場合だと、下記のようになる。
A | B |
---|---|
abc | 100 |
xyz | 120 |
つまり、A列がabcの時は100、A列がxyzの時は120となる。
これと同じようなことをPandasで行う方法をメモしておく。
Pandasでの方法
サンプルデータの取得
今回はPythonで簡単に綺麗なグラフを描くことができるSeabornのサンプルデータを使ってみる。
Seabornでは、load_dataset() でサンプルデータを取得することができる。
取得できるサンプルデータはココで確認できる。
import seaborn as sns
iris = sns.load_dataset('iris')
print(iris)
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
... | ... | ... | ... | ... | ... |
145 | 6.7 | 3.0 | 5.2 | 2.3 | virginica |
146 | 6.3 | 2.5 | 5.0 | 1.9 | virginica |
147 | 6.5 | 3.0 | 5.2 | 2.0 | virginica |
148 | 6.2 | 3.4 | 5.4 | 2.3 | virginica |
149 | 5.9 | 3.0 | 5.1 | 1.8 | virginica |
最大値行の抽出
それでは、上で取得したirisデータのspeciesごとのsepal_lengthの最大値を取得してみることにする。
Pandasでの手順の要点
- 行はlocで抽出する
- グループ分けはgroupbyで行う
- 最大値はidxmax()で求める
iris.loc[iris.groupby("species")["sepal_length"].idxmax(),:]
実行した結果は下記の通り
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
14 | 5.8 | 4.0 | 1.2 | 0.2 | setosa |
50 | 7.0 | 3.2 | 4.7 | 1.4 | versicolor |
131 | 7.9 | 3.8 | 6.4 | 2.0 | virginica |
指定した列だけを表示したいなら、locの,の右側で指定すればいい。
iris.loc[iris.groupby("species")["sepal_length"].idxmax(), ["sepal_length", "sepal_width"]]
実行結果は下記の通り。
sepal_length | sepal_width | |
---|---|---|
14 | 5.8 | 4.0 |
50 | 7.0 | 3.2 |
131 | 7.9 | 3.8 |
できることが増えてくるとだんだん楽しくなってくる。
0 件のコメント :
コメントを投稿