[Python] Pandasでグループごとの最大値を取得する方法

title-image



PythonのPandasの使い方メモ。

Pandasのデータフレームをある列の値でグループ分けしたときに、そのグループごとに他の列の最大値を抽出する方法について。


具体的にどういうことをしたいのか?

たとえば、下記のようなデータフレームがあったとする。
 
A B
abc 100
abc 20
xyz 30
abc 50
xyz 120
xyz 60

A列とB列からなるデータフレームで、A列には”abc"か"xyx"という文字列があり、B列には数字が入力されている。

このとき、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





以上、Pandasでグループごとの最大値を取得する方法について。

できることが増えてくるとだんだん楽しくなってくる。


0 件のコメント :