此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd
> 经常听别人说 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),你知道怎么把他们替换成友好的中文内容吗?
总结
本文重点: