データをグループでまとめるpandas.groupbyの使い方

データをグループでまあ止めるpandas.groupby()の使い方

pythonで表(DataFrame)を扱うとき、地域や種類といったグループごとに比較したい場合がありますよね。

pandas.groupby()関数を使えば、指定した列のカテゴリでグルーピングすることが可能です。

本記事ではpandas.groupbyの使い方をコードを記載して説明します。

目次

pandas.groupbyの使い方

pandas.groupbyとは

それでは実際にpandas.groupby()を使ってみましょう。

次のような流れで説明していきます。

この記事のコードはグーグルコラボラトリーで実際にコーディングし、結果を確認しています。

準備

まず始めにpandas.groupby()を使う準備をしましょう。

準備することは次の2つです。

  • pandasのインポート
  • データセットの用意
#pandasのインポート
import pandas as pd
#データセットの用意
df = pd.DataFrame({
    '品目': ['テレビ', '掃除機', 'テレビ', '掃除機', 'テレビ', '掃除機', 'テレビ', '掃除機', 'テレビ', '掃除機', 'テレビ', '掃除機'],
    'お店': ['東京', '大阪', '大阪', '東京', '東京', '大阪', '大阪', '東京', '東京', '大阪', '大阪', '東京'],
    '販売価格': [17500, 41000, 33000, 39000, 37000, 8500, 48000, 21500, 30500, 46500, 20000, 10500],  
})
df

出力:

index品目お店販売価格
0テレビ東京17500
1掃除機大阪41000
2テレビ大阪33000
3掃除機東京39000
4テレビ東京37000
5掃除機大阪8500
6テレビ大阪48000
7掃除機東京21500
8テレビ東京30500
9掃除機大阪46500
10テレビ大阪20000
11掃除機東京10500
準備したデータセット

今回はのデータセットは、東京と大阪の電気屋さんで売れた家電の販売価格表です。

pandas.groupby()の基本的な使い方

それでは実際にpandas.gruoupbyを使ってみましょう。

DataFrame.groupby(‘列名’)で実行可能です。

用意したデータセットを品目ごとにグルーピングし、df2に格納します。

df2 = df.groupby('品目')
df2

出力:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7ffa106992e0>

実はpandas.groupby()を実行してもグルーピングされた表が出力されるわけではありません。

df2.apply(lambda a: a[:])でグルーピングされた表を可視化できます。

df2.apply(lambda a: a[:])

出力:

品目お店販売価格
品目
テレビ0テレビ東京17500
2テレビ大阪33000
4テレビ東京37000
6テレビ大阪48000
8テレビ東京30500
10テレビ大阪20000
掃除機1掃除機大阪41000
3掃除機東京39000
5掃除機大阪8500
7掃除機東京21500
9掃除機大阪46500
11掃除機東京10500
品目でグルーピング

通常groupbyを使用するときは、グループごとに何かを比較したいことが多いです。

その場合、合計を知りたければsum()、平均を知りたければmean()といった関数を一緒に使用する必要があります。

それでは品目ごとの平均を計算してみましょう。

df2.mean()

出力:

品目販売価格
テレビ31000.0
掃除機27833.333333333332
品目ごとの平均

掃除機の平均販売価格の平均が割り切れませんでした。

もし整数で表示したい場合、astype()を使用します。astype()でintを指定すると、データ型が整数に変更されます。

df2.mean().astype(int)

出力:

品目平均価格
テレビ31000
掃除機27833
平均価格を整数で表示

複数のカテゴリでグルーピング

複数のカテゴリでグルーピングも可能です。複数のカテゴリを指定する場合、リストで指定する必要があります。

品目とお店でカテゴライズした価格の合計を計算してみましょう。

df.groupby(['品目', 'お店']).sum()

出力:

品目お店販売価格
テレビ大阪101000
テレビ東京85000
掃除機大阪96000
掃除機東京71000
各カテゴリごとの販売価格合計

ちなみにcount()関数を使用すれば、各カテゴリごとの販売点数を知ることができます。

df.groupby(['品目', 'お店']).count()

出力:

品目お店販売価格
テレビ大阪3
テレビ東京3
掃除機大阪3
掃除機東京3
各グループごとの販売点数

便利な機能の紹介

ここから機能をいくつか紹介します。

1つ目は引数as_indexです

groupby()で指定した列はインデックスになります。

もしインデックスになるのを避けたい場合、引数as_indexにFalseを指定しましょう。

pandas.groupby as_indexの説明
df.groupby(['品目', 'お店'], as_index=False).sum()

出力:

index品目お店価格
0テレビ大阪101000
1テレビ東京85000
2掃除機大阪96000
3掃除機東京71000
as_index=False

次にindexの情報を確認できる方法の紹介です。

グルーピングしたindexを取得したいときはlist(df2.groups.key)を使いましょう。

list(df2.groups.keys())

出力:

[‘テレビ’, ‘掃除機’]

今回はテレビと掃除機の2つしかありませんが、大量のカテゴリでグルーピングした際は役に立ちます。

幾つのカテゴリに分けられたかを確認したいときはlen(df2.groups)です。

len(df2.groups)

出力:

2

まとめ

今回はDataFrameを指定したカラムのカテゴリでグループ分けする、pandas.groupby()を紹介しました。

グループごとに分けて分析することで、分析の幅が大きく広がります。

もっとpythonを勉強したいと感じたら、ぜひ次の記事もご覧ください。pythonを独学で勉強できる方法を紹介しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次