Pandasについての記事をシリーズで書いています。
今回の記事は第26回目になります。
前回の記事から、PandasのGroupByについて書かせていただき、今回はGroupByについての第2弾の記事になります。
前回は、DataFrameからGroupByオブジェクトを作ったり、そのオブジェクトから、あるグループに所属するものを抜き出したりしました。
今回の記事では、グループ分けされたGroupByオブジェクトに対して、集計をしてみたいと思います
ではさっそく始めていきますね。
今回使うデータ
今回は、kaggle.comさんのサイトからビデオゲームの世界各地域別の販売額のデータを使っていきます。
read_csv()で読み込むと下記のようになります
任天堂が上位をほぼ独占!素晴らしい(笑)
分かりにくいコラムの名前の日本語の説明を下記にかきました
参考にどうぞ。<(_ _)>
Rank - トータル販売額のランク
Year - ゲームがリリースされた年
Genre - ゲームのジャンル
NA_Sales - 北アメリカでの販売(単位百万ドル)
EU_Sales - ヨーロッパでの販売
JP_Sales - 日本での販売
Other_Sales - 上記以外の国での販売
グループ化して、GroupByオブジェクトを作る前に
コラムをグループ分けする前に、各コラムがいくつのグループに分けることができるのか見てみましょう
.info()を使うと、各コラム別に
欠損値ではない列(row)の数 (Non-Null Countがそれにあたる)
データタイプ(Dtypeがそれにあたる)
を示してくれます。
Dtypeがobjectになっているところは、文字列型と同義だと考えてもらって大丈夫です。
今回使うデータには欠損値は無いようです。(Non-Null Countが列の数と等しいから)
②nunique()メソッドを使っていくつの独自のラベルがあるかを調べる
nuniqueは『number of unique』 のことで、文字通りunique(ユニーク、独自性)の数です。
.nunique()を使うことで、それぞれのコラムをいくつのグループに分類できるかをみることができます
Publisherのコラムをgroup_by()メソッドでグループ化し、それで作られたGroupByオブジェクトをpublishers という変数に代入しました。
.groupby()メソッドを使うと、コンピューターの裏側ではどんなことが行われているか?
.groupby()メソッドの引数として渡されたコラムを上から順番にループして、同じ値のものをそれぞれまとめています。(『Nintendo』という値が全て同じグループへ、『Kemco』という値があれば全て同じグループへという感じです。)
そのグループ分けされたGroupByオブジェクトに対してメソッドを使って、色々と集計してみますね。
.get_group()メソッドでグループ化された特定のグループを取り出す
.groupby()を使うと特定のコラムをグループ化しますが、そのグループのうちの特定のグループを取り出すには
.get_group()
を使います。
今回は、『Nintendo』にグループ分けされた部分を取り出します。
『Nintendo』にグループ分けされた部分のみ取り出されました。
これをnintendoという変数に代入して、色々なメソッドを使ってみます。
nintendo に対して、.min() .max()メソッドを使い、nintendoのくくりのなかで、それぞれのコラムの最小値と最大値を取り出しました。(コラムが、文字列型のデータの場合は、最小値は頭文字がaに近い値、最大値はzに近い値となります)
GroupByはMultiIndexにすることもできる
MultiIndexとは、インデックスが二重以上のレイア―でできていることです。
(MultiIndexについては、こちらの記事で詳しく解説しましたので、参考にどうぞ)
MultiIndexにするには、
df.groupby([ "A", "B" ])
とリストを引数として渡します。
上の例ですと、
Aがより外側のインデックスになり、第二引数、第三引数。。。がより内側のインデックスになります
コードを実行してみます。
Genre(第一引数)が一番外側のインデックスになり、Publisher(第二引数)がその内側のインデックスになります。
このように、インデックスを2つ以上取ることで、
より細かい集計が取れるようになります。
(例えば、ゲームのジャンルがアクションで、3DOという会社の北アメリカでの売上高は?などのように)
.agg()メソッドを使えば、さらに複雑な設定ができる
最後に.agg()メソッドを紹介して終わります。
aggとはaggregateのエイリアスで、『集計』という意味です。
例えば、
北アメリカの売上高は全て足し上げて
日本の売上高に関しては、平均値を出したい
というように、違う計算をしたい時に、.agg()メソッドは使えます
Genre という名前のコラムを、groupby()でグループ分けし、それを
北アメリカの売上高とヨーロッパの売上高に関しては、全て足し上げ
日本の売上高に関しては平均値を出したいという時は、下記のようにコードを書くことになります
また、リスト型にして引数として渡すと、リストの中のメソッドを使って全てのコラムの集計をしてくれます。
Pandasのドキュメントも参考にどうぞ
まとめ
今回の記事はこれくらいで終わりにしますね。
次回も引き続きPandasについて書いていきます