【Pandas】.groupby()メソッドを解説します。no.25

![見出しを追加 (56).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/aa2cbb24-d6a8-e576-fc3c-14871ddc21f4.png)

こんにちは、まゆみです。

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

今回は第25回目になります

今回の記事では、Pandasの『Groupby』について書いていこうと思います

Groupbyとは、Groupという文字通り、ある特定のコラムをグループ化します。

そしてオリジナルのDataFrameとは<font color="Red">別の</font>Groupbyオブジェクトが作られます。(詳しくは後述します)

言葉で説明するよりも、コードの実行結果を示しながら説明する方がクリアになると思うので、さっそく始めていきますね


#今回使うデータ

今回は、[日経225企業についてのデータ](https://hesonogoma.com/stocks/nikkei225-stock-prices.html)を使っていきます

CSVデータを読み込むと下記のようになりました。

![スクリーンショット 2021-03-31 075755.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/3c731cb6-9a29-3a79-8280-1501d64ebbf0.jpeg)
社名が書かれた『名称』というコラムをグループ分けするのは、全く意味がありませんよね。

なぜならば、社名は個々で違うのでグループ分けしようがないからです。

今回のデータで言うと『日経業種』とラベルが書かれたコラムなど、<font color="Red">1つのグループのなかにいくつかの会社名がカテゴリー分けされるコラム</font>を選んで、Groupby していきます

#.groupby()メソッド

では、『日経業種』コラムに、.groupby()メソッドを使います

![スクリーンショット 2021-03-31 083039.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f5009450-c6e8-2335-1c4b-f2e9479fba7f.jpeg)
実行結果は上記のようになります


Pandasの.groupby()メソッドを使っても、

<font color="Red">グループ分けされたDataFrameが表示されるわけでもなく、オブジェクト名と保存されているロケーションのみが表示されるだけ(GroupByオブジェクトと呼ばれます)</font>

です。

GroupByオブジェクトは、変数に代入して、オブジェクトに対してメソッドやアトリビュートを使ったりするまでは、グループ分けしたことで得られるメリットは得られないでしょう。

nikkei というDataFrame から作ったGroupByオブジェクトをsectorsという変数に代入します

また、.groupby()メソッドを使ったからと、元のDataFrameが変更されるわけではなく

元のDataFrameとは<font color="Red">別の</font>

<font color="Red">もう一つ別のGroupbyオブジェクト</font>が作られます。

![スクリーンショット 2021-03-31 084307.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/49ba7ca8-6765-f5a7-ac05-8a8f3cca3a42.jpeg)

#groupbyオブジェクトにメソッドを使う

##.size()

.size()を使うと、それぞれにグループ分けされた要素のアイテム数(row(列)の数)を返してくれます

![スクリーンショット 2021-03-31 090041.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0911082e-3a52-c87d-797d-274059221cd1.jpeg)

```
groupby_object.size()
```
と 

```
dataframe["コラム名"].value_counts()
```

はやってくれること自体は似ていますが、value_counts()では、数字が大きいもの順に並べられています

##.groups アトリビュート

PandasのGroupby オブジェクトに使える便利なアトリビュート.goups を紹介します

![スクリーンショット 2021-03-31 091726.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/c1d76c06-8af3-c3ee-e1bc-054184e438ea.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/docs/reference/api/pandas.core.groupby.GroupBy.groups.html)

Pandasドキュメントにあるように、.groupメソッドはPythonの辞書型データを返してくれます

その辞書がどのような構造になっているかというと

![{_group1__ [ row, row], _group2__[row, row]}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/31691282-1254-3686-1068-12b9174313fb.png)


![スクリーンショット 2021-03-31 093237.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0354edad-ef3b-7fb1-36df-549a7c5eceeb.jpeg)

パルプ・紙に分類された値が、37、38列目にあることが分かるので、

.iloc[]で、列全体を指定すると

![スクリーンショット 2021-03-31 093515.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e01126c8-aa04-8048-ccf4-09b984efb028.jpeg)

2つのrowを指定した時は、上記の実行結果のスクショのうち上のような形で、1つだけrow を指定した時は、下のような形で表示されます。

もしくは、先にどのグループのデータを取り出したいか分かっている時は、下記のメソッドが使えます

#.get_group()
![スクリーンショット 2021-03-31 102014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5c0f8267-9f4d-b8e1-38fa-f62b445cf76a.jpeg)

#.groupby()メソッドはパワフルなメソッド

結局、.groupby()メソッドがやってくれることは[この記事](https://qiita.com/Mayumi_Pythonista/items/8af7c687e35003687711#height_in_inches%E3%81%8B%E3%82%89%E6%9D%A1%E4%BB%B6%E3%81%AB%E5%90%88%E3%81%A3%E3%81%9Frow-%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B)に書かせてもらったことと同じです。

条件に合致するものを抜き出して、それをまた同じコラム名に代入して。。。


ただ、.groupby()を使えばもっと早く、もっと少ないコードで同じことをすることができます

#まとめ

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

まだまだ、GroupByオブジェクトに対して使えるメソッドやオブジェクトは他にもたくさんありますが、記事がめちゃくちゃ長くなってしまいそうなので。

次回もまた、GroupByオブジェクトをどのように活用するかの記事を書いていきますね。