groupby について、初歩的なことに絞って書いてみます。後半で、DataFrame の groupby を実際に使ってみます。
groupbyとは
そもそもの目的は、大量にあるデータを集計すること
groupby の目的は何かといえば、データの集計です。
ですが、集計といっても、ただ単純に合計や平均を知りたいだけなら groupby は不要です。sum や mean メソッドを呼ぶだけで済んでしまいます。
でも、月別とか顧客別でこまかく集計をとろうとすると、データのグルーピングが必要になります。その グルーピング を行うのが groupby です。
たとえば、通販サイトの販売データがあったとします。
顧客ごとに並べ替えます。
顧客でグルーピングしたわけですが、でも、これはデータを並べ替えただけで、このままではあまり意味がありません。
なんのためにグルーピング(groupby)したのかと言えば、集計するためです。では、集計するためにどうするかというと、グルーピング結果に関数を適用します。関数とは、たとえば、最大値を取得する max()、合計を計算する sum() などです。
ここで重要なポイントは、関数が赤枠ごとに実行されることです。
min を適用すると
groupby 結果に min 関数を適用すると、赤枠ごとの 最小値 が選択されます。

次のことが読み取れます。
AA さんの買い物のうち
- 最小の価格は 1000 円
- 最小の値引きは 150 円
BB さんの買い物のうち
- 最小の価格は 50000 円
- 最小の値引きは 5000 円
max を適用すると
groupby 結果に max 関数を適用すると、赤枠ごとの 最大値 が選択されます。

次のことが読み取れます。
AA さんの買い物のうち
- 最大の価格は 150000 円
- 最大の値引きは 20000 円
BB さんの買い物のうち
- 最大の価格は 200000 円
- 最大の値引きは 10000 円
sum を適用すると
groupby 結果に sum 関数を適用すると、赤枠ごとに 合算 されます。ただし、文字列は合算できないので商品は除外されます。

次のことが読み取れます。
AA さんの買い物は
- 価格の合計が 156000 円
- 値引き額の合計が 20550 円
BB さんの買い物は
- 価格の合計が 320000 円
- 値引き額の合計が 23000 円
以上が groupby の基本的な使い方です。次節で実際に動かしてみます。
python で実行
pandas の DataFrame で簡単に groupby が使えるので試してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from pandas import DataFrame df=DataFrame([['AA','TV',150000,20000], ['BB','Camera',70000,10000], ['AA','Video',2000,200], ['AA','Video',3000,150], ['BB','TV',200000,8000], ['BB','Camera',50000,5000], ['AA','Video',1000,200]], columns=['CUSTOMER','PRODUCT','PRICE','DISCOUNT']) #--------------------------------------- # CUSTOMER PRODUCT PRICE DISCOUNT # 0 AA TV 150000 20000 # 1 BB Camera 70000 10000 # 2 AA Video 2000 200 # 3 AA Video 3000 150 # 4 BB TV 200000 8000 # 5 BB Camera 50000 5000 # 6 AA Video 1000 200 #--------------------------------------- |
groupby 実行
1 |
grouped = df.groupby('CUSTOMER') |
min
1 2 3 4 5 6 7 |
grouped.min() #--------------------------------------- # PRODUCT PRICE DISCOUNT # CUSTOMER # AA TV 1000 150 # BB Camera 50000 5000 #--------------------------------------- |
max
1 2 3 4 5 6 7 |
grouped.max() #--------------------------------------- # PRODUCT PRICE DISCOUNT # CUSTOMER # AA Video 150000 20000 # BB TV 200000 10000 #--------------------------------------- |
sum
1 2 3 4 5 6 7 |
grouped.sum() #--------------------------------------- # PRICE DISCOUNT # CUSTOMER # AA 156000 20550 # BB 320000 23000 #--------------------------------------- |
値を取り出す
集計結果は DataFrame で返されます。欲しい情報は、カラムとインデックスを指定して取得します。
顧客すべての「価格の合計」を取り出す
1 2 3 4 5 6 |
grouped.sum().PRICE #--------------- # CUSTOMER # AA 156000 # BB 320000 #--------------- |
特定顧客の「価格の合計」を取り出す
1 2 3 4 |
grouped.sum().PRICE.AA #--------- # 156000 #--------- |
複数の項目で groupby
顧客と商品など、複数の項目でグルーピングすることもできます。項目を指定するために配列を使います。
1 2 3 4 5 6 7 8 9 |
df.groupby(['CUSTOMER','PRODUCT']).sum() #------------------------------------- # PRICE DISCOUNT # CUSTOMER PRODUCT # AA TV 150000 20000 # Video 6000 550 # BB Camera 120000 15000 # TV 200000 8000 #------------------------------------- |
count、size、mean、std
count、size(件数)や mean(平均)、std(標準偏差) といった関数も使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
grouped.count() #------------------------------------ # PRODUCT PRICE DISCOUNT # CUSTOMER # AA 4 4 4 # BB 3 3 3 #------------------------------------ grouped.size() #------------------------------------ # CUSTOMER # AA 4 # BB 3 #------------------------------------ grouped.mean() #------------------------------------ # PRICE DISCOUNT # CUSTOMER # AA 39000.000000 5137.500000 # BB 106666.666667 7666.666667 #------------------------------------ grouped.std() #------------------------------------ # PRICE DISCOUNT # CUSTOMER # AA 74004.504363 9908.361368 # BB 81445.278150 2516.611412 #------------------------------------ |