Python 無料で独習 データ集計(groupby)の方法 Pandas入門09

Python
この記事は約7分で読めます。

この講義ではデータを集計する方法について学習します。
具体例として売上管理表を使って
部署、名前ごとで売上げや平均を集計をするといった方法を
コードを入力しながら学びます。
Excelでいうと、Sum関数、sumifs関数、countifs関数、
SQLでいうとGroupbyの方法だそうです。
Excelまではなんとか馴染みがありますが、
SQLは少し敷居が高く感じますがなんとか頑張ります。

学習するにあたって、キノコードさんのサイトにある
サンプルデータを使用します。
あらかじめダウンロードしてjupyter notebookと
同じフォルダに保存します。
キノコードさんのサイトのサンプルデータ

前回同様、

  • pandasのインポート
  • DataFrameの表示範囲の設定
  • エクセルファイルの読み込み

までを行います。

import pandas as pd
pd.set_option('display.max_columns', None) # 最大表示列数
pd.set_option('display.max_rows', 5) # 最大表示行数
df = pd.read_excel('sample.xlsx',sheet_name='実績管理表')
df

今回この講義で使用するデータはとあるアパレル会社の
売り上げ実績表で、どのスタッフがどのジャンルの商品を
いくら売り上げたかが入っています。

個人ごとの集計

個人ごとの売り上げ合計や平均など色々な集計をしてみます。
まずは個人売上の平均をみます。

#氏名ごとにグループオブジェクトをつくる。
df.groupby(‘氏名’)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001EB4E4A4070>

#mean()関数で平均をとります。
df.groupby('氏名').mean()
	単価	数量	売上金額
氏名			
上瀬 由和	7555.555556	6.333333	49925.925926
井上 真	7458.333333	4.916667	39000.000000
...	...	...	...
石崎 和香菜	8016.949153	5.322034	41847.457627
西尾 謙	8117.647059	5.205882	42323.529412
6 rows × 3 columns

売上金額の平均

売上金額だけ平均にしたい場合は
データから二重括弧で氏名と売上金額だけを抽出して
groupbyの丸括弧の中に氏名を記述します。

df[['氏名','売上金額']].groupby('氏名').mean()
	売上金額
氏名	
上瀬 由和	49925.925926
井上 真	39000.000000
...	...
石崎 和香菜	41847.457627
西尾 謙	42323.529412
6 rows × 1 columns

float_formatメゾットを使って小数点以下を表示しない

上の表でデータは取得できたのですが、
小数点以下が多すぎて見にくいです。
その場合setoptionで設定します。
今回詳しい内容の説明はありませんでしが、
少数点以下の表示をなくすにはこう書くんだなぁと
いうふうに記憶しようと思います。

pd.options.display.float_format = '{:.0f}'.format
df[['氏名','売上金額']].groupby('氏名').mean()
	売上金額
氏名	
上瀬 由和	49926
井上 真	39000
...	...
石崎 和香菜	41847
西尾 謙	42324
6 rows × 1 columns

個人ごとの売り上げ合計を算出

個人ごとの売り上げ合計を出すには
エクセルでおなじみ
sum関数をつかって合計を導きだします。

df[['氏名','売上金額']].groupby('氏名').sum()

	売上金額
氏名	
上瀬 由和	1348000
井上 真	936000
...	...
石崎 和香菜	2469000
西尾 謙	1439000
6 rows × 1 columns

aggメソッド

aggはAggregationの略です。
Aggregationは集約、凝縮するといった意味です。
このメゾットを使用するとmean平均をとるなどを
違ったコードを使って出力できます。

df[['氏名','売上金額']].groupby('氏名').agg('mean')

	売上金額
氏名	
上瀬 由和	49926
井上 真	39000
...	...
石崎 和香菜	41847
西尾 謙	42324
6 rows × 1 columns

aggメソッドが有益なのは、
平均や合計を同時に出力することができます。。

出力したい計算方法をaggの丸括弧の中にリストで渡します

df[['氏名','売上金額']].groupby('氏名').agg(['mean','sum'])

売上金額
mean	sum
氏名		
上瀬 由和	49926	1348000
井上 真	39000	936000
...	...	...
石崎 和香菜	41847	2469000
西尾 謙	42324	1439000
6 rows × 2 columns

aggメソッド(複数計算)

以前の講義でも学習した
describeで一気に主要な計算を行うこともできます。

df_group = df[['氏名','売上金額']].groupby('氏名').agg(['describe'])
df_group.applymap('{:,.0f}'.format)
売上金額
describe
     count	mean	std	min	25%	50%	75%	max
氏名								
上瀬 由和	27	49,926	38,469	4,000	22,500	40,000	64,000	144,000
井上 真	24	39,000	33,940	3,000	13,750	30,000	55,500	144,000
...	...	...	...	...	...	...	...	...
石崎 和香菜	59	41,847	30,707	3,000	18,000	40,000	60,000	180,000
西尾 謙	34	42,324	40,974	4,000	16,500	27,000	54,000	180,000
6 rows × 8 columns

桁区切り表示

表示する数字の桁数が増えてくると、どうしても見にくくなってしまいます。
そういう時、三桁ごとにカンマを表示する関数もあります。
すこし複雑なので、少数点以下の表示をなくした時と同様に
こういった関数があるのだということをだいたいで覚えておこうと思います。

df_group = df[['氏名','売上金額']].groupby('氏名').agg(['mean','sum'])
df_group.applymap('{:,.0f}'.format)
売上金額
mean	sum
氏名		
上瀬 由和	49,926	1,348,000
井上 真	39,000	936,000
...	...	...
石崎 和香菜	41,847	2,469,000
西尾 謙	42,324	1,439,000
6 rows × 2 columns

自作の関数をaggメソッドで適用

今回は自作の関数として、消費税を掛ける計算式をいれます。
それをaggメソッドに渡します。

import numpy as np

def cal_tax(s):
 return np.sum(s)*1.08

df[['氏名','売上金額']].groupby('氏名').agg({'売上金額': cal_tax})

	売上金額
氏名	
上瀬 由和	1455840
井上 真	1010880
...	...
石崎 和香菜	2666520
西尾 謙	1554120
6 rows × 1 columns

コメント

タイトルとURLをコピーしました