前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >懂Excel轻松入门Python数据分析包pandas(二十一):透视表

懂Excel轻松入门Python数据分析包pandas(二十一):透视表

作者头像
咋咋
发布2021-09-01 14:43:00
1.2K0
发布2021-09-01 14:43:00
举报
文章被收录于专栏:数据大宇宙数据大宇宙

> 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas

前言

本系列上一节文章最后我随手使用了 pandas 中的透视表操作,之后有些小伙伴询问我相关的问题。正好 pandas 的 pivot_table 也是与 Excel 透视表对应。本文简单教你入门使用 pandas 完成透视表功能。

继续使用泰坦尼克号沉船事件的乘客名单作为例子:

- pclass:船舱等级

- survived:是否生还

- fare:票价

- sex:性别

- home.dest:住址

案例1:分析性别对生还率的影响

这里只简单说明怎么制作透视表,以方便那些不熟悉透视表的小伙伴:

- 3步完成

分析目标涉及的维度:

- 性别

- 生还率

这些维度用于分类依据,放入透视表的行或列标签:

- 把 sex 字段拖入 行标签,survived 字段拖入 列标签

- 还需要统计人数,人名总是有的,因此把 name 字段拖入 数值区域

- 透视表立刻出结果,行标签 放入的字段的唯一值,被显示在透视表左侧。列标签 放入的字段的唯一值,被显示在透视表的上方

只看数值看不出门路,设置百分比吧:

- 点中透视表任意一格,鼠标右键

- 按上图指示完成

- 女性 生还率远高于 男性!!

> 接下来不再显示 Excel 透视表操作

pandas 要做出透视表的效果,实际与 Excel 透视表的概念基本一致:

- 参数 index 就是 Excel 透视表中的 行标签

- 参数 columns : Excel 透视表中的 列标签

- 参数 values:Excel 透视表中的 数值区域

- 参数 aggfunc:Excel 透视表中的 数值区域 的字段的统计方式(Excel 默认是计数)

"好像少了点东西……"

没有总计行列,可以通过参数设置:

- 参数 margins 默认为 False,显示总计行列

- 参数 margins_name ,设置总计行列的索引值

> 实际上很少需要使用这2个参数,因为 pandas 中添加这2列是非常简单

"Excel 透视表是百分比呀"

pandas 透视表功能没有参数设置,因为本身透视出来的还是一个 DataFrame ,这可以利用之前学到的一切技巧来为这个 DataFrame "添油加醋":

- 默认情况下,如果把一个 DataFrame 作为文本显示,小数是不会变百分比,这里可以设置 pd.set_option('display.float_format', '{:.2%}'.format) 。这种设置不会影响数据类型,比如把此结果输出到 Excel ,仍然是小数

- 行9:每行(axis=1)做运算(apply),行中每个数字(r) 除以(/) 行中剔除最后一个数据(r[:-1])的总和(sum)

案例2:贫富差距

我们用透视表分析 船舱等级(1表示一等舱,2表示二等舱……) 与 生还率的影响。

下面是 Excel 透视表结果:

接着是 pandas 实现:

- 修改 index 参数为 pclass,即可按船舱等级汇总

- 行9:不想再重复编写那段"非人"看的占比计算,直接调用一个自定义的函数(函数实现看源码)

从结果可以看到,头等舱生还率最高(更多原因是船舱等级越低,位置越靠近船底部,逃生越困难)

"我还想结合性别看看船舱等级对生还率的影响,怎么搞?"

很简单,pivot_table 中的大部分参数都可以放入多个字段(跟 Excel 透视表操作一样):

- index 参数传入多个字段的列表

从结果看到,每个等级的船舱还是"女性比男性更可能生还"

"嘿,感觉直接用 Excel 透视表就好了,还写啥代码,麻烦死"

如果只是上述这些简单汇总的分析,我也建议直接用 Excel 透视表。但实际工作中,不可能只是这么简单的汇总。

案例3:小伙伴结伴同游,更安全

以前我发布过一篇文章,曾经使用 power bi 对这个数据进行初步分析,文中发现,里面有些人是一起登记上船的,而结伴上船的人有更高的生还率。

> 相关文章:[公众号 -> 数据分析 -> 探索分析]。文章中并没有给出 pandas 代码。

但是,原始数据是没有字段可以直接反映是否有结伴上船的情况。

数据中 ticket 列是船票号,**有相同的船票号并且多于1人以上的,可以视为是购买套票**的,也就是一起上船的。

解决思路就是:把 ticket 列内容相同的归为一组,组内有多于1行记录的,就是有小伙伴一起上船的

相信一直看本系列的小伙伴马上就知道,这在 pandas 中不就是分组操作吗!下面是代码:

- 行3:这句就是把每个人标记为"是否套票"的实现,这个不多解析了,几乎与上面说的中文语义一致

- 行5-10:利用透视表,对字段 isgroup 统计一下生还人数比例

- 很明显,没有小伙伴的人里面(上图结果的第一行),生还比例只有 27.21% 。相比较,有小伙伴一起上船的乘客(上图结果的第二行),生还人数比例就比较高

> 上面结果的行列显示不太好看(isgroup 显示 True 和 False,survived 显示 0 和 1),你知道怎么把他们替换成友好的中文内容吗?

数据大宇宙

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档