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を独学で勉強できる方法を紹介しています。
コメント