Pandas透视表和交叉表

个人理解:透视表和交叉表都是可分组汇总表,透视表可以求平均值,求和等等,交叉表是透视表的一种,是计算分组频数的

 

参考:《利用Python进行数据分析》

透视表
pivot_table的参数
交叉表crosstab
总结
透视表

透视表(pivot table)是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上得分组建将数据分配到各个矩形区域中。在Python和pandas中,可以通过本章所介绍的groupby功能以及(能够利用层次化索引的)重塑运算制作透视表。DataFrame有一个pivot_table方法,此外还有一个顶级的pandas.pivot_table函数。除了能为groupby提供便利之外,pivot_table还可以添加分项小计(也叫margins)。
 
回到如上图所示的小费数据集,假设我想要根据sex和smoker计算分组平均数(pivot_table的默认聚合类型),并将sex和smoker放到行上:

# 方法一:使用groupby
tips.groupby(['sex', 'smoker']).mean()
# 方法二:使用pivot_table
tips.pivot_table(row=['sex', 'smoker'])
1
2
3
4
结果是一样的(严格来说,列的排列顺序不一样): 
 
现在假设我们只想聚合tip_pct和size,而且想根据day进行分组。我将smoker放到列上,把day放到行上:

tips.pivot_table(values=['tip_pct', 'size'], index=['sex', 'day'], columns='smoker')
1
 
可以看到,pivot_table()函数给我们提供了很多参数,用来选择用那些数据创建透视表,以及调整创建透视表之后的行和列。 
还可以对这个表作进一步处理,传入margins=True添加加分小计。这将会添加标签为ALL的行和列,其值对应于单个等级中所有数据的分组统计。在下面这个例子中,ALL值为平均数:不单独考虑烟民与非烟民(ALL列),不单独考虑行分组两个级别中的任何单项(ALL行)。换句话说:就是下面的ALL行和右边的ALL列只统计对应的列和行。

tips.pivot_table(values=['tip_pct', 'size'], index=['sex', 'day'], columns='smoker', margins=True)
1
 
要使用其他的聚合函数,将其传给参数aggfunc即可。例如,使用count或len可以得到有关分组大小的交叉表:

tips.pivot_table('tip_pct', index=['sex', 'smoker'], columns='day', aggfunc=len, margins=True)
1


pivot_table的参数

aggfunc : function or list of functions, default numpy.mean 
If list of functions passed, the resulting pivot table will have hierarchical columns whose top level are the function names (inferred from the function objects themselves) 
fill_value : scalar, default None 
Value to replace missing values with 
margins : boolean, default False 
Add all row / columns (e.g. for subtotal / grand totals)

parameters    introduction
data    DataFrame
values    待聚合的列的名称。默认聚合所有数值列
index    用于分组的列名或其他分组键,出现在结果透视表的行
columns    用于分组的列名或其他分组键,出现在结果透视表的列
aggfunc    聚合函数或函数列表,默认为‘mean’。可以使任何对groupby有效的函数
fill_value    用于替换结果表中的缺失值
dropna    boolean,默认为True
margins_name    string,默认为‘ALL’,当参数margins为True时,ALL行和列的名字
交叉表:crosstab

交叉表(cross-tabulation, 简称crosstab)是一种用于计算分组频率的特殊透视表。下面这个范例数据很典型,取自交叉表的Wikipedia页:
data = pd.DataFrame({'Sample': range(1, 11), 'Gender': ['Female', 'Male', 'Female', 'Male', 'Male', 'Male', 'Female', 'Female', 'Male', 'Female'], 
                    'Handedness': ['Right-handed', 'Left-handed', 'Right-handed', 'Right-handed', 'Left-handed', 'Right-handed', 'Right-handed', 'Left-handed', 'Right-handed', 'Right-handed']})
1
2
 
假设我们想要根据性别和用手习惯对这段数据进行统计汇总。虽然可以用pivot_table()实现该功能,但是pandas.crosstab()函数会更方便:

# 方法一:用pivot_table
# 其实我觉的一点都不麻烦ε=(´ο`*)))唉
data.pivot_table(index=['Gender'], columns='Handedness', aggfunc=len, margins=True)
# 方法二:用crosstab
pd.crosstab(data.Gender, data.Handedness, margins=True)
1
2
3
4
5
 
可以看到,crosstab()的前两个参数可以是数组、Series或数组列表。再比如对小费数据集:

pd.crosstab([tips.time, tips.day], tips.smoker, margins=True)
1


总结

透视表pivot_table()是一种进行分组统计的函数,参数aggfunc决定统计类型;
交叉表crosstab()是一种特殊的pivot_table(),专用于计算分组频率(个人:应该理解为分组频数)。
--------------------- 
作者:hustqb 
来源:CSDN 
原文:https://blog.csdn.net/hustqb/article/details/78086394 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值