【Python】开启Pandas进阶:图解Pandas透视表、交叉表
共 4756字,需浏览 10分钟
· 2021-08-20
一、图解Pandas透视表、交叉表
终于开始Pandas进阶内容的写作了。相信很多人都应该知道透视表,在Excel会经常去制作它,来实现数据的分组汇总统计。在Pandas中,我们把它称之为pivot_table。
透视表的制作灵活性高,可以随意定制我们想要的的计算统计要求,一般在制作报表神器的时候常用。
下面通过具体的例子来对比Excel和Pandas中透视表的实现方法。
![](https://filescdn.proginn.com/016e62b22b89588dd70450ab8db17a73/b4a6c52bab37ba90be64c77c17506dd7.webp)
二、Excel透视表
下面是在Excel表格中使用消费数据制作的透视表(部分数据截图),我们统计的是不同性别不同日期下的消费金额和小费,同时还显示了总计的数据。
![](https://filescdn.proginn.com/bc7c7322db95a80636eb31f430390310/070ab104f66fad64032135999d118412.webp)
![](https://filescdn.proginn.com/6e71f75734bfd2e811703bbc568c4610/9d72ba6243627d981f9110b0817ce8d7.webp)
![](https://filescdn.proginn.com/a719b462222f3959bb7823107dbbfd36/9a5b2ea829de4fe1b8e1546922a084e7.webp)
那如果是使用pandas该如何来实现呢???
三、透视表参数
pandas中实现透视表使用的是:pandas.pivot_table
pd.pivot_table(data, # 制作透视表的数据
values=None, # 值
index=None, # 行索引
columns=None, # 列属性
aggfunc='mean', # 使用的函数,默认是均值
fill_value=None, # 缺失值填充
margins=False, # 是否显示总计
dropna=True, # 缺失值处理
margins_name='All', # 总计显示为All
observed=False,
sort=True # 排序功能 版本1.3.0才有
)
最重要的参数还是:values、index、columns、aggfunce,甚至包含margins、margins_name
附上官网学习地址:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html
四、透视表参数详解
4.1参数index
index表示的是我们生成透视表指定的行索引
1、单层索引
![](https://filescdn.proginn.com/a457436ff64b255da2564dc107303ceb/2e0ed56affa6fb2d52e90019ef32bf17.webp)
![](https://filescdn.proginn.com/402bc65a4af68ddc92d5e2763964ce79/8be8cd90fd0fecbd9fb73a38c317355b.webp)
2、多层行索引
![](https://filescdn.proginn.com/fcd3e15702b48b32d5427fc3575b0051/0fb4227b56789b0fc2174ab552b8e4e8.webp)
4.2参数values
在上面index参数的使用中,我们没有指定values参数,pandas会默认将全部的数值型数据进行透视表的计算,现在指定参数计算的数据:
带上values,只会显示我们指定的数据 不带上values,数值型的数据汇总结果全部显示
![](https://filescdn.proginn.com/be59be5b51522225b456ba47e2de02ad/bbaf8ef15db219cc8ea183a4f38c8ecb.webp)
4.3参数columns
columns是一个显示列属性信息的参数
![](https://filescdn.proginn.com/49bfefa4d2bafe2429e27705e0962870/5c1c5977f4bbfba20fb83914f2fe845f.webp)
如果我们将day放在index参数中,会是什么样子呢?
相当于是:将上面的宽表格式转成了下面的长表格式
![](https://filescdn.proginn.com/461d3c49518d65f7f814af1635a651ef/da1b76b51134c95edc0b30d22b97890f.webp)
再对比下两种不同的形式:
![](https://filescdn.proginn.com/a4278e828c0bc7afc477ba3a256a3574/7b79bfe4e53353abb2b95e046dcf85e8.webp)
4.4参数aggfunc
aggfunc是一个很灵活的参数,它是用来指定我们汇总想用哪种函数,默认是均值mean,我们也可以使用求和sum、最值max等。多个函数需要放在一个列表中。
我们将默认求平均mean的情况与求和的情况进行对比:
![](https://filescdn.proginn.com/66d2281e51c0c07b1fa8a10d823a5949/34e4190c4049ff4e1d2dcfff79b14b9d.webp)
均值和sum求和之间的关系:
![](https://filescdn.proginn.com/0b05757fb1f98668614253fcf64751e9/3e6198639f9b59e87b5a30c696309af9.webp)
我们可以在aggfunc函数中指定多个函数,将这些函数放在同一个列表中:
求和:np.sum 求均值:mean 求个数:size
![](https://filescdn.proginn.com/afe65499b1020e4af096a3d7e7f975cb/5cad363a36ffa75b6fadc88d49ee1ec4.webp)
再看一个例子:
![](https://filescdn.proginn.com/6a8aca6d569886dccae0cc6bb28bb80f/0e7522d8f4a4d408299e83ba497306fe.webp)
4.5参数margins、margins_name
这两个参数的作用是对透视表中的分组数据进行汇总显示。需要注意的是:只有margins=True,参数margins_name的设置才会生效。
![](https://filescdn.proginn.com/3cea71e628793f12a82deda9c4e3914d/157a24bd12ad2a8b63d37cacf32579a8.webp)
修改汇总显示的名字:
![](https://filescdn.proginn.com/43cf23a499da32175c9712e0e8c8a02b/01ff0eb2205bff5a863bb0b6d659d811.webp)
如果有列字段,也会显示汇总的数据:
![](https://filescdn.proginn.com/6bb73235390d9639b5a8e0e59f5eb513/80cbb6084391b5bda305de895ddccde3.webp)
五、交叉表crosstab
交叉表可以理解成一种特殊的透视表,专门用于计算分组的频率。
5.1参数
交叉表中每个参数的解释,很多还是和透视表相同的:
pandas.crosstab(index, # 行索引,必须是数组结构数据,或者Series,或者是二者的列表形式
columns, # 列字段;数据要求同上
values=None, # 待透视的数据
rownames=None, # 行列名字
colnames=None,
aggfunc=None, # 透视的函数
margins=False, # 汇总及名称设置
margins_name='All',
dropna=True, # 舍弃缺失值
normalize=False # 数据归一化;可以是布尔值、all、index、columns、或者{0,1}
)
对最后一个参数的解释:如何选择归一化的标准
If passed ‘all’ or True, will normalize over all values:使用all,对全部的数值型数据归一化 If passed ‘index’ will normalize over each row:使用index,仅在行上归一化 If passed ‘columns’ will normalize over each column:使用columns,仅在列上归一化 If margins is True, will also normalize margin values:如果margins=True,总计值也会参与归一化
5.2参数使用
![](https://filescdn.proginn.com/6b96578da04e16d81a2d7b0e3d6a1197/44f42d7595c11c9bd52851c4f6e98cb9.webp)
当然,有时候透视表和交叉表是可以实现相同的功能:
![](https://filescdn.proginn.com/a8665fe33c1de3ea1b9b0485cfa80416/cc18c78f8a3a834fecee06af85361303.webp)
六、groupby实现
其实透视表或者交叉表的本质还是分组汇总统计结果,我们也可以利用groupby来实现:
1、先分组统计
![](https://filescdn.proginn.com/8888c0f7de62689367993d439f769d75/4927cf9a5876c2234ebba829c6d769ff.webp)
2、轴旋转unstack
上面的结果格式上不是很友好,使用的是多层次索引,我们使用轴旋转函数unstack将行转成列:
![](https://filescdn.proginn.com/c8c0c63dcca493eedb4e2e456ef474a2/6be88a5f753699497327221475296180.webp)
七、groupby和透视表比较
最后再用一个例子来比较下groupby和透视表:
![](https://filescdn.proginn.com/bf6dc44bc46827c3d3400784e9c7c94b/20960b6acec4cf6cb6f30420991dc3a7.webp)
八、备忘录
这个网上非常流行的一张图解Pandas透视表函数的图形,它利用一份简单的数据,清晰明了地讲解了pivot_table函数的每个参数的含义,保存备用!
![](https://filescdn.proginn.com/eac7768162a3d7e2d2496d99ed2895df/caa5a06934d7dabd68d3392ed86ce68b.webp)
往期精彩回顾 本站qq群851320808,加入微信群请扫码: