一文让你吃透!图解 pandas 透视表、交叉表!
共 5610字,需浏览 12分钟
· 2021-09-11
![](https://filescdn.proginn.com/a0197f738308c9924e84fbb728446f63/b3eaf1fd99a9175eb9f6eabd35a6c3b1.webp)
一、图解Pandas透视表、交叉表
终于开始Pandas进阶内容的写作了。相信很多人都应该知道透视表,在Excel会经常去制作它,来实现数据的分组汇总统计。在Pandas中,我们把它称之为pivot_table。
透视表的制作灵活性高,可以随意定制我们想要的的计算统计要求,一般在制作报表神器的时候常用。
下面通过具体的例子来对比Excel和Pandas中透视表的实现方法。
二、Excel透视表
下面是在Excel表格中使用消费数据制作的透视表(部分数据截图),我们统计的是不同性别不同日期下的消费金额和小费,同时还显示了总计的数据。
![](https://filescdn.proginn.com/d2762fa11d2b6a4b2b494bc2a01efcf9/836d14b9d5a18aa67cb93b49c15120a8.webp)
![](https://filescdn.proginn.com/3d41c0f41b6abcc4334d36c8863e27ac/4e81f0ce77445baa99b90d9e8f789215.webp)
![](https://filescdn.proginn.com/f30891f529eae429bc6e49ff293c673d/65c13e539e879c88957010e9fe46e136.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/44b092180bd7218f096efc238c91073d/1668c681d129d2956593296bbf0cbf42.webp)
![](https://filescdn.proginn.com/313fc9b2d238c938ea09c2a8f6132a82/5119b69d9beaa20902420864b20e371d.webp)
2、多层行索引
![](https://filescdn.proginn.com/9b0acdeb4034dbfe1118e37f64f54813/ede376d0df7310403e0d8e7550235f28.webp)
4.2参数values
在上面index参数的使用中,我们没有指定values参数,pandas会默认将全部的数值型数据进行透视表的计算,现在指定参数计算的数据:
带上values,只会显示我们指定的数据 不带上values,数值型的数据汇总结果全部显示
![](https://filescdn.proginn.com/dcd50bac696fab0eda2058f4ab7c4faa/d9b9c00d5226cdf64168f4f7197a2414.webp)
4.3参数columns
columns是一个显示列属性信息的参数
![](https://filescdn.proginn.com/1a8c0399b0e1a4793de44ada5522d413/3bb90d925bbb9b578e8feac57ee8d44a.webp)
如果我们将day放在index参数中,会是什么样子呢?
相当于是:将上面的宽表格式转成了下面的长表格式
![](https://filescdn.proginn.com/b7db4f61a4878e131865b160703b67a3/50e0a43261dfba06550b78d2822a9e26.webp)
再对比下两种不同的形式:
![](https://filescdn.proginn.com/bf415f9698c2bc916d1963d1ffd59b4c/0402258cd3b0c6ceaae32189e9cfe8ca.webp)
4.4参数aggfunc
aggfunc是一个很灵活的参数,它是用来指定我们汇总想用哪种函数,默认是均值mean,我们也可以使用求和sum、最值max等。多个函数需要放在一个列表中。
我们将默认求平均mean的情况与求和的情况进行对比:
![](https://filescdn.proginn.com/cb3dd5ada4449d5e7da84e7080e3eb14/fdedf6fc1a5a8daf0a8d6fd89cc7e0a5.webp)
均值和sum求和之间的关系:
![](https://filescdn.proginn.com/b304eaf3f318049860e497a2dd05d119/0fdf7b230868ea0e6bd9687097c2f5ed.webp)
我们可以在aggfunc函数中指定多个函数,将这些函数放在同一个列表中:
求和:np.sum 求均值:mean 求个数:size
![](https://filescdn.proginn.com/1903042623fa37ff2a88fff0bcdb8705/d135b0b1991c0eae33c043262f33f6c8.webp)
再看一个例子:
![](https://filescdn.proginn.com/daa5e41c367c63b22f13a8a90a837b60/be17802c9b1f0c1942c59de2650794c0.webp)
4.5参数margins、margins_name
这两个参数的作用是对透视表中的分组数据进行汇总显示。需要注意的是:只有margins=True,参数margins_name的设置才会生效。
![](https://filescdn.proginn.com/4c53ce5922cc57f31fa602b8ba5d3383/cd776b7777699d3f64674d30e28e5407.webp)
修改汇总显示的名字:
![](https://filescdn.proginn.com/2a4d150269f55eb780c2db4c6565fbbd/984b721c59476b81aadf0393d0fbfc69.webp)
如果有列字段,也会显示汇总的数据:
![](https://filescdn.proginn.com/cfbcb47e083cb136504f7ea33996e468/1c5c1f3db7cb09ee7611981f4d405b8f.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/db39b62c2936a133a64d330b92ff236e/e2c1b56482f7311cdc6c26637b68f640.webp)
当然,有时候透视表和交叉表是可以实现相同的功能:
![](https://filescdn.proginn.com/0a145355f9da1115b768d856c8eadc88/bc6f6f7d8eaebaef89f11a105d8d3c82.webp)
六、groupby实现
其实透视表或者交叉表的本质还是分组汇总统计结果,我们也可以利用groupby来实现:
1、先分组统计
![](https://filescdn.proginn.com/a4c5fe559626dbc0052a98a60ef9b6fd/162833e9dfe5b68a1ef1282768e83398.webp)
2、轴旋转unstack
上面的结果格式上不是很友好,使用的是多层次索引,我们使用轴旋转函数unstack将行转成列:
![](https://filescdn.proginn.com/84ac7d775610df9baa44e315f4e6c2af/f283f0b1a6059ff95b20c386be3d237e.webp)
七、groupby和透视表比较
最后再用一个例子来比较下groupby和透视表:
![](https://filescdn.proginn.com/846f9df5c808d8b9ac736f019af8e080/0ad2a5906c0c765f2785e10a182b8590.webp)
八、备忘录
这个网上非常流行的一张图解Pandas透视表函数的图形,它利用一份简单的数据,清晰明了地讲解了pivot_table函数的每个参数的含义,保存备用!
![](https://filescdn.proginn.com/6bae070bf3e40c42e690574c4630b3a1/55e59027eaaa6af6ce436d5d742e8a4d.webp)
网络图
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
推荐阅读:
入门: 最全的零基础学Python的问题 | 零基础学了8个月的Python | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 | 从万众期待到口碑扑街!唐探3令人失望 | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏 | 九宫格 | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!| 再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|
年度爆款文案
点阅读原文,领AI全套资料