【Pandas】.groupby()メソッドでグループ化したあとに集計してみるno.26

![見出しを追加 (58).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1e2492e5-c50b-8208-cbdb-fd5a380a78f8.png)
こんにちは、まゆみです。

Pandasについての記事をシリーズで書いています。

今回の記事は第26回目になります。

[前回の記事](https://qiita.com/Mayumi_Pythonista/items/30bab64ba08fa216313e)から、PandasのGroupByについて書かせていただき、今回は<font color="Red">GroupByについての第2弾の記事</font>になります。

前回は、DataFrameからGroupByオブジェクトを作ったり、そのオブジェクトから、あるグループに所属するものを抜き出したりしました。

今回の記事では、グループ分けされたGroupByオブジェクトに対して、<font color="Red">集計をしてみたい</font>と思います

ではさっそく始めていきますね。

#今回使うデータ
![見出しを追加 (57).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/58fffd39-3ebe-9255-a9d1-575fa9ff4ddf.png)

今回は、[kaggle.com](https://www.kaggle.com/)さんのサイトから[ビデオゲームの世界各地域別の販売額のデータ](https://www.kaggle.com/gregorut/videogamesales)を使っていきます。

read_csv()で読み込むと下記のようになります

![スクリーンショット 2021-04-01 075151.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0d8ea106-c042-91a0-c226-99f241414adb.jpeg)

任天堂が上位をほぼ独占！素晴らしい(笑)

分かりにくいコラムの名前の日本語の説明を下記にかきました
参考にどうぞ。<(_ _)>

>Rank - トータル販売額のランク
>Year - ゲームがリリースされた年
>Genre -　ゲームのジャンル
>NA_Sales -　北アメリカでの販売(単位百万ドル)
>EU_Sales -　ヨーロッパでの販売
>JP_Sales - 日本での販売
>Other_Sales -　上記以外の国での販売

#グループ化して、GroupByオブジェクトを作る前に

コラムをグループ分けする前に、各コラムがいくつのグループに分けることができるのか見てみましょう

>①.info()メソッドでDataFrameの概要を知る
![スクリーンショット 2021-04-01 080756.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0407db7f-ccef-aa20-a9ec-c9488b0edb6b.jpeg)

.info()を使うと、各コラム別に

>欠損値ではない列(row)の数　(Non-Null Countがそれにあたる)

>データタイプ(Dtypeがそれにあたる)

を示してくれます。

Dtypeがobjectになっているところは、文字列型と同義だと考えてもらって大丈夫です。

今回使うデータには欠損値は無いようです。(Non-Null　Countが列の数と等しいから)

>②nunique()メソッドを使っていくつの独自のラベルがあるかを調べる

nuniqueは『number of unique』 のことで、文字通りunique(ユニーク、独自性)の数です。

.nunique()を使うことで、それぞれのコラムをいくつのグループに分類できるかをみることができます

![スクリーンショット 2021-04-01 081157.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/7b011dd7-a5f5-69d0-532b-1520262125f0.jpeg)


Publisherのコラムをgroup_by()メソッドでグループ化し、それで作られたGroupByオブジェクトをpublishers という変数に代入しました。

![スクリーンショット 2021-04-01 133648.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d2bcc200-a833-fab5-3616-33626c76988f.jpeg)


![スクリーンショット 2021-04-01 133927.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4dd37005-76a6-4e9b-ce21-faa1debfdf5f.jpeg)

.groupby()メソッドを使うと、コンピューターの裏側ではどんなことが行われているか？

.groupby()メソッドの引数として渡されたコラムを上から順番にループして、同じ値のものをそれぞれまとめています。(『Nintendo』という値が全て同じグループへ、『Kemco』という値があれば全て同じグループへという感じです。)

そのグループ分けされたGroupByオブジェクトに対してメソッドを使って、色々と集計してみますね。


#.get_group()メソッドでグループ化された特定のグループを取り出す

![見出しを追加 (59).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/55287b7f-7636-a1a1-8d1c-4f70ff968103.png)

.groupby()を使うと特定のコラムをグループ化しますが、そのグループのうちの特定のグループを取り出すには

>.get_group()

を使います。

今回は、『Nintendo』にグループ分けされた部分を取り出します。
![スクリーンショット 2021-04-01 141717.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ae0fe6bd-f5a1-6902-6c84-7a22db458cc9.jpeg)

『Nintendo』にグループ分けされた部分のみ取り出されました。

これをnintendoという変数に代入して、色々なメソッドを使ってみます。

nintendo に対して、.min() .max()メソッドを使い、nintendoのくくりのなかで、それぞれのコラムの最小値と最大値を取り出しました。(コラムが、文字列型のデータの場合は、最小値は頭文字がaに近い値、最大値はｚに近い値となります)

![スクリーンショット 2021-04-01 142141.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/91bf4e19-d8ca-de72-1b8c-0e546bba4860.jpeg)

#GroupByはMultiIndexにすることもできる

MultiIndexとは、インデックスが二重以上のレイア―でできていることです。


(MultiIndexについては、[こちらの記事](https://qiita.com/Mayumi_Pythonista/items/b14c91b020f5f5eba787)で詳しく解説しましたので、参考にどうぞ)

MultiIndexにするには、

```
df.groupby([ "A", "B" ])
```

とリストを引数として渡します。

上の例ですと、

<font color="Red">Aがより外側のインデックスになり、第二引数、第三引数。。。がより内側のインデックス</font>になります

コードを実行してみます。

![スクリーンショット 2021-04-01 164357.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9c1c8fe4-3db9-28df-7999-a92ec8953454.jpeg)

Genre(第一引数)が一番外側のインデックスになり、Publisher(第二引数)がその内側のインデックスになります。

このように、インデックスを2つ以上取ることで、

より細かい集計が取れるようになります。
(例えば、ゲームのジャンルがアクションで、3DOという会社の北アメリカでの売上高は？などのように)

#.agg()メソッドを使えば、さらに複雑な設定ができる

最後に.agg()メソッドを紹介して終わります。

aggとはaggregateのエイリアスで、『集計』という意味です。


![見出しを追加 (60).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a6d077bb-a8b5-a183-ccc2-968c5caaf039.png)

例えば、

>北アメリカの売上高は全て足し上げて

>日本の売上高に関しては、平均値を出したい

というように、違う計算をしたい時に、.agg()メソッドは使えます

![見出しを追加 (61).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4470211e-f3ce-9291-7680-0ee4ed14c187.png)

Genre という名前のコラムを、groupby()でグループ分けし、それを

>北アメリカの売上高とヨーロッパの売上高に関しては、<font color="Red">全て足し上げ</font>

>日本の売上高に関しては<font color="Red">平均値を出したい</font>という時は、下記のようにコードを書くことになります

![スクリーンショット 2021-04-01 170704.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9fd497cb-8e6c-0006-44bc-fa2bac940717.jpeg)

また、リスト型にして引数として渡すと、リストの中のメソッドを使って全てのコラムの集計をしてくれます。
![スクリーンショット 2021-04-01 171933.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9f53009c-8d83-b5a2-5cd1-ca84cedce433.jpeg)

Pandasのドキュメントも参考にどうぞ

![スクリーンショット 2021-04-01 172356.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0fab9e39-74c9-f8c0-210b-9722a882fb29.jpeg)
引用元：Pandasドキュメント

#まとめ

今回の記事はこれくらいで終わりにしますね。

次回も引き続きPandasについて書いていきます