pythonで表(DataFrame)を扱うとき、地域や種類といったグループごとに比較したい場合がありますよね。
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を指定しましょう。

df.groupby(['品目', 'お店'], as_index=False).sum()出力:
| index | 品目 | お店 | 価格 | 
|---|---|---|---|
| 0 | テレビ | 大阪 | 101000 | 
| 1 | テレビ | 東京 | 85000 | 
| 2 | 掃除機 | 大阪 | 96000 | 
| 3 | 掃除機 | 東京 | 71000 | 
次にindexの情報を確認できる方法の紹介です。
グルーピングしたindexを取得したいときはlist(df2.groups.key)を使いましょう。
list(df2.groups.keys())出力:
[‘テレビ’, ‘掃除機’]
今回はテレビと掃除機の2つしかありませんが、大量のカテゴリでグルーピングした際は役に立ちます。
幾つのカテゴリに分けられたかを確認したいときはlen(df2.groups)です。
len(df2.groups)出力:
2
まとめ
今回はDataFrameを指定したカラムのカテゴリでグループ分けする、pandas.groupby()を紹介しました。
グループごとに分けて分析することで、分析の幅が大きく広がります。
もっとpythonを勉強したいと感じたら、ぜひ次の記事もご覧ください。pythonを独学で勉強できる方法を紹介しています。

			
			
			
			
			
			
			
			
コメント