![Python+Office:轻松实现Python办公自动化](https://wfqqreader-1252317822.image.myqcloud.com/cover/834/40107834/b_40107834.jpg)
3.7 数据的透视
透视表是各类数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。本节将介绍利用pivot_table()函数和crosstab()函数进行数据透视。
3.7.1 pivot_table()函数:数据透视
在Python中,可以使用groupby()函数重塑运算制作透视表。此外在Pandas库中还有一个pivot_table()函数。
下面介绍一下Pandas库中pivot_table()函数的参数及其说明,如表3-1所示。
表3-1 pivot_table()函数的参数及其说明
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_91.jpg?sign=1739234462-TQoPtC5my9S4ToT9qx6e5mILRNtNK53T-0-2b0bbb19789397155b9337b16ccc7c0e)
续表
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_92.jpg?sign=1739234462-UzGkssmCGfnQ293c8sRpXjEviIb1KEct-0-8c0b0db8692c37d32581098609ffbfdd)
接下来,我们介绍下面程序使用的数据集。众所周知,在西方国家的服务行业中,顾客会给服务员一定金额的小费,这里我们使用餐饮行业的小费数据集,它包括消费总金额(totall_bill)、小费金额(tip)、顾客性别(sex)、消费的星期(day)、消费的时间段(time)、用餐人数(size)、顾客是否抽烟(smoker)等7个字段,如表3-2所示。
表3-2 顾客小费数据集
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_93.jpg?sign=1739234462-RCfwX0lARBvQl0OteHIyHyrtq5UfqbNw-0-c307878a15452b23275b771e9ab6b474)
下面导入数据集,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_94.jpg?sign=1739234462-vTktEz4OTnZ6tUAUGfF8F0wVEFQnjOcw-0-6df61bfe7d74dcb896019e79a3ebbd7d)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_95.jpg?sign=1739234462-XZFyksTnwQfTSayQITzK52GCqprjPNVH-0-73cd951f06646436b390125e0f78bc52)
例如,想要根据sex和smoker计算分组平均数,并将sex和smoker放到行上,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_96.jpg?sign=1739234462-jHCka6rB7gvx4FnT2qSVbpQZR7ljwzxp-0-cdeb88c2a5bdb0d01aad2ea7b1216e15)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_97.jpg?sign=1739234462-Vw9J6MoeaTskpXVmrEwFczM6LGDLjuKX-0-73c1f153b30ec486f5fe4f2778c2a441)
例如,想要聚合tip和size,而且需要根据sex和day进行分组,将smoker放到列上,把sex和day放到行上,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_98.jpg?sign=1739234462-NDxGsjQFMWSHGWWyoiYDNyisUHD8T5YF-0-fd4a6dc9f50328db793fa1ae883247c0)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_99.jpg?sign=1739234462-J4F3TD3RGR49F4YDTG3Wv0y3JZg2AwxZ-0-248244ef7b314cd996ed1b356936bd27)
可以对这个表做进一步处理。例如,设置margins=True,添加加分小计,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_100.jpg?sign=1739234462-rsigSm6FZ6fGFkyV03TlR7p9S6nFtOt6-0-4193a87b1ae9c19c2484d69c98623b3c)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_101.jpg?sign=1739234462-m4AY3l0FYiObgHQYSGxzJyMgdO9Xa4yp-0-0b11f12e67acda845737d97e34b7dfd3)
如果想要使用其他的聚合函数,则将其传给参数aggfunc即可。例如,使用len可以得到有关分组大小的交叉表,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_102.jpg?sign=1739234462-my5oxFDHH969zXi49XOk8nVkbnzerpUM-0-c071573470fddef0e326dff35f850a91)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_103.jpg?sign=1739234462-L3u3wphkZt9PbdFGrIKaS8yNiBqqQLqv-0-558d30257a1524aa33fa28d6987c2779)
3.7.2 crosstab()函数:数据交叉
Pandas库中的crosstab()函数是一类用于计算分组频率的特殊透视表,也是一类特殊的pivot_table()函数。
例如,需要根据性别和是否吸烟对数据进行统计汇总,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_104.jpg?sign=1739234462-UgbnyGKWhopm6bzlwbVhX9GftkN0QMv7-0-5a635e74252aa10865e93ae5bdb29601)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_105.jpg?sign=1739234462-zplevJ8fjrNwbyvH4Fj5mdgGvzJjdtit-0-29e79a23923d8b7a0d516a8cf07569a3)
例如,需要根据性别、星期和是否吸烟对数据进行统计汇总,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_106.jpg?sign=1739234462-QdmQUzPjHVUHRdvEcDGwm6aWJQJ7IgBg-0-23c606dd604bccd3cf773b7c2c6b5695)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_107.jpg?sign=1739234462-9v3xl4zqhHWmarUPvyeMPNnR50BV2tIO-0-3a671aaeb13d4d076dfa6a72e51e9449)