透视表(pivot)是由微软发明的一个概念,1993年微软注册了PivotTable这一商标,而他们又在2020年正式撤销了注册。
关于透视表的话题随便搜搜就是一大堆,而有些地方可能都吹得很神了。透视表的不多说,我们直接通过Pandas中关于它的操作来认识。
再次回到张三团伙的例子:
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月的收入是空,而回到原表可以发现的确没有他在这个月的收入情况。
如果我们把应用场景拉回到现实:原表即是每个员工每个月的收入,作为老板或者会计是不是就想看看员工的总收入情况。那么此时如果作为财务人员,一步就能取出老板想要看的东西。非常地方便!
由于这个对象太过重要,我们还是老实地看一遍官方文档的说明:
参数 | 说明 |
---|---|
index |
str 或对象或str 列表 |
用于制作新框架索引的列。 如果为None,则使用现有索引。 | |
columns |
str 或对象或str 列表 |
用于制作新框架列的列。 | |
values |
str ,对象或先前列表(可选) |
用于填充新框架值的列。 如果未指定,将使用所有剩余的列,并且结果将具有按层次结构索引的列。 | |
返回类型 | |
DataFrame。 |
返回调整后的DataFrame。 |
结果我们刚才的例子,index
被重新指定为“月份”,所以新表就是按列索引的。columns
是姓名,于是每个人的名字变成了列,最后values
被指定为“应发工资”。这一系列操作如果变成老板的需求就成了:
给我做一个每个人的月收入报表,只要应发工资。
如果没有感受到这种操作的便利,那就自己手动操作一下。
当然上述情况也只是其中一种,另外作为老板的我们可能也还想知道,除了详细情况以外,各员工的总收入是怎样的,于是
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的属性及方法大全
做到现在相信各位同学也都能多少有点感觉了。第一个例子中我们将index
和columns
分开,然后就变成了一张新表。如果我们用数组的观点来看的话,这两个东西其实刚好就代表数据的两个维度,每个对应位置的数据本身其实并没有发生变化。换言之,数据透视表其实就是将这种一维表变成二维表的过程。
回到第一例,我们仔细查看就不难发现,“月份”和“姓名”是两个完全独立的维度,它们自己有重复,但它们的组合并没有重复。那么这样的表,就可以很自然地做成透视表。
反之,如果不满足这个条件透视表就无从谈起,比如:
df.pivot(index = '月份',columns = '性别',values = '应发工资')
---------------------------------------------------------------------------
ValueError: Index contains duplicate entries, cannot reshape
这时就报错说有重复的项存在。这里主要是“月份”和“性别”的组合对应得有相同的值,因此就无法对它们进行透视。
那么,在实际操作过程中,就要时刻想着作为index
和columns
的这两个维度的组合不存在重复值即可。
上面的内容只是一个简单的介绍,要彻底弄明白透视表还得多多去练习,把更多的实例装进脑子才更容易融会贯通。这里我们找到一些讲得比较好的贴子供大家参考:
一文看懂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数据透视表
九、表的合并、连接、拼接(数据聚合基础)