pandas中的数据透视表

透视表在一定程度上可以称作是split-apply-combine的快捷方式。DataFramepivot_table()方法,对应的顶级的pandas.pivot_table()函数。除了提供便利的groupby之外还提供了分项小计margins


import numpy as np
import pandas as pd
file = r'../data/tips.csv'
tips = pd.read_csv(file)
tips.head()
total_billtipsmokerdaytimesize
016.991.01NoSunDinner2
110.341.66NoSunDinner3
221.013.50NoSunDinner3
323.683.31NoSunDinner2
424.593.61NoSunDinner4
tips['tip_pct'] = tips['tip'] / tips['tip'].sum()
tips.head()
total_billtipsmokerdaytimesizetip_pct
016.991.01NoSunDinner20.001381
110.341.66NoSunDinner30.002269
221.013.50NoSunDinner30.004784
323.683.31NoSunDinner20.004524
424.593.61NoSunDinner40.004935

便捷的分组平均

  • 假设根据tips数据集,对time和smoker进行分组平均:
tips.pivot_table(index=['time', 'smoker'])
sizetiptip_pcttotal_bill
timesmoker
DinnerNo2.7358493.1268870.00427420.095660
Yes2.4714293.0660000.00419121.859429
LunchNo2.5111112.6737780.00365517.050889
Yes2.2173912.8343480.00387417.399130
注意:所有的非数值类型被自动过滤,且默认聚合方法为平均值方法。

指定行列及聚合对象

  • 假设我们对tip_pct, size进行聚合,将smoker作用在列上,将time, day作用在行上:
tips.pivot_table(columns='smoker', index=['time', 'day'], values=['tip_pct', 'size'])
sizetip_pct
smokerNoYesNoYes
timeday
DinnerFri2.0000002.2222220.0037590.004105
Sat2.5555562.4761900.0042410.003931
Sun2.9298252.5789470.0043300.004807
Thur2.000000NaN0.004101NaN
LunchFri3.0000001.8333330.0041010.003117
Thur2.5000002.3529410.0036450.004142

分项小计

  • 在聚合后的基础上添加margins=True可以实现分项小计:

    小计的结果使用All标记,同时列的复合索引根据最高级求和。
tips.pivot_table(columns='smoker', index=['time', 'day'], values=['tip_pct', 'size'], margins=True)
sizetip_pct
smokerNoYesAllNoYesAll
timeday
DinnerFri2.0000002.2222222.1666670.0037590.0041050.004019
Sat2.5555562.4761902.5172410.0042410.0039310.004091
Sun2.9298252.5789472.8421050.0043300.0048070.004449
Thur2.000000NaN2.0000000.004101NaN0.004101
LunchFri3.0000001.8333332.0000000.0041010.0031170.003257
Thur2.5000002.3529412.4590160.0036450.0041420.003783
All2.6688742.4086022.5696720.0040900.0041130.004098

自定义聚合方法

  1. 默认方法是平均值
  2. 其他聚合方法可通过aggfunc来传递
# nan有碍观瞻就改为0了
tips.pivot_table(values='tip_pct', index=['time', 'smoker'], columns='day', aggfunc=len, margins=True, fill_value=0)
dayFriSatSunThurAll
timesmoker
DinnerNo345571106.0
Yes94219070.0
LunchNo1004445.0
Yes6001723.0
All19877662244.0

复杂的聚合

tips.pivot_table(values=['size', 'tip_pct'], index=['time', 'smoker'], columns='day',
                 aggfunc={'tip_pct': [len, sum], 'size': max}, fill_value=0)
sizetip_pct
maxlensum
dayFriSatSunThurFriSatSunThurFriSatSunThur
timesmoker
DinnerNo24623455710.0112770.1908610.2468220.004101
Yes45509421900.0369470.1650810.0913370.000000
LunchNo3006100440.0041010.0000000.0000000.160365
Yes2004600170.0186990.0000000.0000000.070409

👉pivot_table()参数说明表:

参数名说明
values待聚合的列的名称,默认所有数值列。
index用于分组的列名或其他分组键,出现在结果透视表的行。
columns用于分组的列名或其他分组键,出现在结果透视表的列。
aggfunc聚合函数或函数列表,默认为mean。可以是对任何groupby有作用的函数。
fill_value用于替换结果中的空值的值
margins添加行列的小计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值