DataFrame からピボットテーブルを作ってみます。
データはこんな感じ。通販サイトの売上げデータと考えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from pandas import DataFrame df=DataFrame([['4-10','AA','TV',150000,15000], ['4-10','BB','Camera',70000,7000], ['4-10','AA','Book',2000,200], ['4-10','AA','Book',3000,300], ['4-10','CC','TV',200000,20000], ['4-11','BB','Camera',50000,5000], ['4-11','CC','Book',1000,100]], columns=['DATE','CUSTOMER','PRODUCT','PRICE','TAX']) #----------------------------------------- # DATE CUSTOMER PRODUCT PRICE TAX # 0 4-10 AA TV 150000 15000 # 1 4-10 BB Camera 70000 7000 # 2 4-10 AA Book 2000 200 # 3 4-10 AA Book 3000 300 # 4 4-10 CC TV 200000 20000 # 5 4-11 BB Camera 50000 5000 # 6 4-11 CC Book 1000 100 #----------------------------------------- ↑ ↑ ↑ ↑ ↑ 日付 顧客 商品 価格 消費税 |
- 目次 -
スポンサーリンク
pivot_table
作成は pivot_table メソッドを呼ぶだけです。最低限、次の3つを指定すればピボットテーブルができあがります。
- 集計対象(価格、消費税など)
- 集計キー(顧客別、日付別など)
- 集計方法(合計、平均など)
呼び出し方は
1 2 3 4 |
df.pivot_table(values = 集計対象, index = 集計キー, aggfunc = 集計方法) # ↑ # または columns # |
顧客別
CUSTOMER 別に PRICE の合計をとってみます。aggfunc に sum を指定すれば合計が計算されます。
1 2 3 4 5 6 7 8 9 10 |
df.pivot_table(values = ['PRICE'], index = ['CUSTOMER'], aggfunc = 'sum') #------------------- # PRICE # CUSTOMER # AA 155000 # BB 120000 # CC 201000 #------------------- |
顧客 + 商品別
数字を細かく見るため、集計キーに PRODUCT を追加します。
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 |
df.pivot_table(values = ['PRICE'], index = ['CUSTOMER'], columns = ['PRODUCT'], aggfunc = 'sum') #----------------------------------------- # PRICE # PRODUCT Book Camera TV # CUSTOMER # AA 5000 NaN 150000 # BB NaN 120000 NaN # CC 1000 NaN 200000 #----------------------------------------- # # NaN を 0 に置きかえる(fill_value = 0 を指定) # df.pivot_table(values = ['PRICE'], index = ['CUSTOMER'], columns = ['PRODUCT'], aggfunc = 'sum', fill_value = 0) #----------------------------------------- # PRICE # PRODUCT Book Camera TV # CUSTOMER # AA 5000 0 150000 # BB 0 120000 0 # CC 1000 0 200000 #----------------------------------------- |
小計を表示
margins = True で小計が表示されます(ALL 欄)。
1 2 3 4 5 6 7 8 9 10 11 12 |
df.pivot_table(values = ['PRICE'], index = ['CUSTOMER'], columns = ['PRODUCT'], aggfunc = 'sum', fill_value = 0, margins = True) #----------------------------------------- # PRICE # PRODUCT Book Camera TV All # CUSTOMER # AA 5000 0 150000 155000 # BB 0 120000 0 120000 # CC 1000 0 200000 201000 # All 6000 120000 350000 476000 #----------------------------------------- |
集計対象の追加
消費税をいっしょに集計します。
1 2 3 4 5 6 7 8 9 10 11 |
df.pivot_table(values = ['PRICE','TAX'], index = ['CUSTOMER'], columns = ['PRODUCT'], aggfunc = 'sum', fill_value = 0) #--------------------------------------------------- # PRICE TAX # PRODUCT Book Camera TV Book Camera TV # CUSTOMER # AA 5000 0 150000 500 0 15000 # BB 0 120000 0 0 12000 0 # CC 1000 0 200000 100 0 20000 #--------------------------------------------------- |
集計の方法を変えてみる
aggfunc には sum 以外に、max や min、count、mean などが指定できます。
(指定のない場合は mean が適用されます)
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 31 |
# # 件数をカウント # df.pivot_table(values = ['PRICE'], index = ['CUSTOMER'], columns = ['PRODUCT'], aggfunc = 'count', fill_value = 0) #----------------------------------------- # PRICE # PRODUCT Book Camera TV # CUSTOMER # AA 2 0 1 # BB 0 2 0 # CC 1 0 1 #----------------------------------------- # # いちばん高い買い物 # df.pivot_table(values = ['PRICE'], index = ['CUSTOMER'], columns = ['PRODUCT'], aggfunc = 'max', fill_value = 0) #----------------------------------------- # PRICE # PRODUCT Book Camera TV # CUSTOMER # AA 3000 0 150000 # BB 0 70000 0 # CC 1000 0 200000 #----------------------------------------- |
インデックスを階層化
インデックスやカラムに複数の項目を並べることもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# # 日別、顧客別 + 商品別 # df.pivot_table(values = ['PRICE'], index = ['DATE','CUSTOMER'], columns = ['PRODUCT'], aggfunc = 'sum', fill_value = 0) #----------------------------------------- # PRICE # PRODUCT Book Camera TV # DATE CUSTOMER # 4-10 AA 5000 0 150000 # BB 0 70000 0 # CC 0 0 200000 # 4-11 BB 0 50000 0 # CC 1000 0 0 #----------------------------------------- |
梅雨よ says:
おつかれ