![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=1734420095-rudso5AE4Af0HPLzIz2l9V14fmhfmc57-0-0c448176b9c2cfddfcd79dc7608426c8)
续表
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_92.jpg?sign=1734420095-U4B1KeCS7ng5UH8tMLybzEKGZohA6v36-0-683352cceb41fb186cf80ae167129364)
接下来,我们介绍下面程序使用的数据集。众所周知,在西方国家的服务行业中,顾客会给服务员一定金额的小费,这里我们使用餐饮行业的小费数据集,它包括消费总金额(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=1734420095-4OZik9t0OfEbI6ATNDZBTXAEhNoiqOoc-0-0bca928d9cae2915f317226bec870ddf)
下面导入数据集,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_94.jpg?sign=1734420095-PDwj9X6kScJiQzvVDgkginKbN3yryNkK-0-510080986e2305544d434c05475d56a3)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_95.jpg?sign=1734420095-kPQ0tRjo3IyRBbChEX704oC5YAvw9WBX-0-36500543135213c9842b367163a2b3ee)
例如,想要根据sex和smoker计算分组平均数,并将sex和smoker放到行上,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_96.jpg?sign=1734420095-zfnEb9mgjdwtEqpkYAfu0I0wRLBKkLsD-0-556b845efd06f91121c0139a252fc39d)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_97.jpg?sign=1734420095-lMPCK4RTS1oIgkd2vsyjJOco9Vc4WRWU-0-0352b88876e9e8f2801ee6ae21c69b07)
例如,想要聚合tip和size,而且需要根据sex和day进行分组,将smoker放到列上,把sex和day放到行上,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_98.jpg?sign=1734420095-IHxGiAZFCXkZK2213uwIfmCaWqd1BHNM-0-433cb2835ca23a3b7546c7484d192595)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_99.jpg?sign=1734420095-qLg7TyoRLjCL75wFeKSHWmQgvKQo5CR4-0-106d342740493fd93db3de77952f9de4)
可以对这个表做进一步处理。例如,设置margins=True,添加加分小计,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_100.jpg?sign=1734420095-ZCE0rLcQq7CdvhdWX3RDLatOkyqZOBNA-0-3797f81bd40f5255e537ea131ba149e2)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_101.jpg?sign=1734420095-xtmUp09NNnZdD3Qq95HuLsEORuCcFpfC-0-9e2ac3cf47d43bb54e0a360ddb09b49b)
如果想要使用其他的聚合函数,则将其传给参数aggfunc即可。例如,使用len可以得到有关分组大小的交叉表,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_102.jpg?sign=1734420095-yaCEChfzxwlhPeuejOfKVVmBKu3oZju2-0-3ba3830505cf9e93047a870944746efe)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_103.jpg?sign=1734420095-xSuLKq9yZ9pOidV1QdefXZg44CPYqAza-0-fa11a7b6e0b8874fba86459d20084e16)
3.7.2 crosstab()函数:数据交叉
Pandas库中的crosstab()函数是一类用于计算分组频率的特殊透视表,也是一类特殊的pivot_table()函数。
例如,需要根据性别和是否吸烟对数据进行统计汇总,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_104.jpg?sign=1734420095-cGPrjeAmZds6F0CQqHq2pW6nlIuMl4zh-0-003a845470755cac453aeac41655ab87)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_105.jpg?sign=1734420095-n6koR3vumqN8exve4rNQMNgZXLUztGbM-0-20426588b994205ad5f082cf28b609ac)
例如,需要根据性别、星期和是否吸烟对数据进行统计汇总,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_106.jpg?sign=1734420095-l1qYVESdjWWYrvJ4pbEhMokLPUkdwkyy-0-ba97a7973823e737290c9bc44dab4075)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt004_107.jpg?sign=1734420095-uV7RuSYxWP00Gt3PlJtja7PkMkxPWig3-0-73b23d2ab39c8f11aff617cadff6fc88)