Pandas简明教程:八、Pandas数据透视表

透视表(pivot)是由微软发明的一个概念,1993年微软注册了PivotTable这一商标,而他们又在2020年正式撤销了注册。

关于透视表的话题随便搜搜就是一大堆,而有些地方可能都吹得很神了。透视表的不多说,我们直接通过Pandas中关于它的操作来认识。

1、透视表的基本操作方法

再次回到张三团伙的例子

df

    月份  姓名 性别  应发工资   实发工资  职位
0    1  张三  男  2000   1500  主犯
1    2  张三  男  2000   1000  主犯
2    3  张三  女  2000  15000  主犯
3    4  张三  女  2000   1500  主犯
4    5  张三  女  2000   1500  主犯
5    2  李四  男  1800   1300  从犯
6    3  李四  男  1800   1300  从犯
7    4  李四  男  1800   1300  从犯
8    5  李四  男  1800   1300  从犯
9    1  王五  女  1800   1300  龙套
10   2  王五  女  1800   1300  龙套
11   3  王五  女  1800   1300  龙套
12   4  王五  女  1800   1300  龙套

这张表仔细看看,主要是记录了3个人几个月以来的收入情况,这就很像是公司员工的收入甚至于个人的收入了(比如把姓名一栏改成某个收入类目)。这样的表很详细,但也有缺点,那就是当我想看一些汇总的数据的时候,手动起来就很头痛了。于是我们先来看一个简单的例子:

df.pivot(index = '月份',columns = '姓名',values = '应发工资')

姓名      张三      李四      王五
月份                        
1   2000.0     NaN  1800.0
2   2000.0  1800.0  1800.0
3   2000.0  1800.0  1800.0
4   2000.0  1800.0  1800.0
5   2000.0  1800.0     NaN

上面的代码返回的是这三个人按月的收入状况。其中王五在5月的收入是空,而回到原表可以发现的确没有他在这个月的收入情况。

如果我们把应用场景拉回到现实:原表即是每个员工每个月的收入,作为老板或者会计是不是就想看看员工的总收入情况。那么此时如果作为财务人员,一步就能取出老板想要看的东西。非常地方便!

由于这个对象太过重要,我们还是老实地看一遍官方文档的说明:

参数说明
indexstr或对象或str列表
用于制作新框架索引的列。 如果为None,则使用现有索引。
columnsstr或对象或str列表
用于制作新框架列的列。
valuesstr,对象或先前列表(可选)
用于填充新框架值的列。 如果未指定,将使用所有剩余的列,并且结果将具有按层次结构索引的列。
返回类型
DataFrame。返回调整后的DataFrame。

结果我们刚才的例子,index被重新指定为“月份”,所以新表就是按列索引的。columns是姓名,于是每个人的名字变成了列,最后values被指定为“应发工资”。这一系列操作如果变成老板的需求就成了:

给我做一个每个人的月收入报表,只要应发工资。

如果没有感受到这种操作的便利,那就自己手动操作一下。

2、透视+统计

当然上述情况也只是其中一种,另外作为老板的我们可能也还想知道,除了详细情况以外,各员工的总收入是怎样的,于是

df.pivot(columns = '姓名',values = '实发工资').sum()

姓名
张三    20500.0
李四     5200.0
王五     5200.0
dtype: float64

注意,由于我们这次是要计算总收入,所以索引就不能再是月份,直接默认就好。而此时如果非要加上索引,那么它也会消失。

df.pivot(index='月份',columns = '姓名',values = '实发工资').sum()

姓名
张三    20500.0
李四     5200.0
王五     5200.0
dtype: float64

结果和上面一样。这是因为由于我们用了sum()这个函数。它的本质是对values进行操作,而此时values被操作的维度刚好和index一致,因此index也就没有存在的必要了。

当然,结合上述实例我们也能想得到可以用类似的方法来查询最大值、最小值、平均值、中位数等等。具体的相关函数可以查看Pandas中DataFrame的属性及方法大全

3、透视表的本质

做到现在相信各位同学也都能多少有点感觉了。第一个例子中我们将indexcolumns分开,然后就变成了一张新表。如果我们用数组的观点来看的话,这两个东西其实刚好就代表数据的两个维度,每个对应位置的数据本身其实并没有发生变化。换言之,数据透视表其实就是将这种一维表变成二维表的过程

回到第一例,我们仔细查看就不难发现,“月份”和“姓名”是两个完全独立的维度,它们自己有重复,但它们的组合并没有重复。那么这样的表,就可以很自然地做成透视表。

反之,如果不满足这个条件透视表就无从谈起,比如:

df.pivot(index = '月份',columns = '性别',values = '应发工资')
---------------------------------------------------------------------------

ValueError: Index contains duplicate entries, cannot reshape

这时就报错说有重复的项存在。这里主要是“月份”和“性别”的组合对应得有相同的值,因此就无法对它们进行透视。

那么,在实际操作过程中,就要时刻想着作为indexcolumns的这两个维度的组合不存在重复值即可。

4、其它建议

上面的内容只是一个简单的介绍,要彻底弄明白透视表还得多多去练习,把更多的实例装进脑子才更容易融会贯通。这里我们找到一些讲得比较好的贴子供大家参考:

一文看懂pandas的透视表pivot_table

python pandas库——pivot使用心得

pandas.DataFrame.pivot — pandas 1.1.0 documentation

Python | Pandas.pivot() - GeeksforGeeks

本系列教程教程完整目录:

一、Pandas简介与安装

二、Pandas基本数据结构-DataFrame与Series

三、Pandas文件读写

四、Pandas数据索引方式

五、Pandas简单统计操作及通用方式

六、Pandas条件查询

七、Pandas缺失数据的处理(数据清洗基础)

八、Pandas数据透视表

九、表的合并、连接、拼接(数据聚合基础)

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半个冯博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值