この講義ではデータを集計する方法について学習します。
具体例として売上管理表を使って
部署、名前ごとで売上げや平均を集計をするといった方法を
コードを入力しながら学びます。
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
コメント