Python 数据透视表 计数 python处理excel数据透视表_python pandas处理excel



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

前言

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

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


Python 数据透视表 计数 python处理excel数据透视表_python pandas处理excel_02


  • pclass:船舱等级
  • survived:是否生还
  • fare:票价
  • sex:性别
  • home.dest:住址

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

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


Python 数据透视表 计数 python处理excel数据透视表_python pandas处理excel_03


Python 数据透视表 计数 python处理excel数据透视表_python pandas处理excel_04


Python 数据透视表 计数 python处理excel数据透视表_Python 数据透视表 计数_05


  • 3步完成

分析目标涉及的维度:

  • 性别
  • 生还率

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


Python 数据透视表 计数 python处理excel数据透视表_Python 数据透视表 计数_06


  • 把 sex 字段拖入 行标签,survived 字段拖入 列标签
  • 还需要统计人数,人名总是有的,因此把 name 字段拖入 数值区域
  • 透视表立刻出结果,行标签 放入的字段的唯一值,被显示在透视表左侧。列标签 放入的字段的唯一值,被显示在透视表的上方

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


Python 数据透视表 计数 python处理excel数据透视表_Python 数据透视表 计数_07


  • 点中透视表任意一格,鼠标右键
  • 按上图指示完成


Python 数据透视表 计数 python处理excel数据透视表_python pandas处理excel_08


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

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


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


Python 数据透视表 计数 python处理excel数据透视表_Python 数据透视表 计数_09


  • 参数 index 就是 Excel 透视表中的 行标签
  • 参数 columns : Excel 透视表中的 列标签
  • 参数 values:Excel 透视表中的 数值区域
  • 参数 aggfunc:Excel 透视表中的 数值区域 的字段的统计方式(Excel 默认是计数)

"好像少了点东西……"

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


Python 数据透视表 计数 python处理excel数据透视表_Python 数据透视表 计数_10


  • 参数 margins 默认为 False,显示总计行列
  • 参数 margins_name ,设置总计行列的索引值

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



Python 数据透视表 计数 python处理excel数据透视表_python pandas处理excel_11


"Excel 透视表是百分比呀"

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


Python 数据透视表 计数 python处理excel数据透视表_Python 数据透视表 计数_12


  • 默认情况下,如果把一个 DataFrame 作为文本显示,小数是不会变百分比,这里可以设置 pd.set_option('display.float_format', '{:.2%}'.format) 。这种设置不会影响数据类型,比如把此结果输出到 Excel ,仍然是小数
  • 行9:每行(axis=1)做运算(apply),行中每个数字(r) 除以(/) 行中剔除最后一个数据(r[:-1])的总和(sum)

案例2:贫富差距

我们用透视表分析 船舱等级 与 生还率的影响。

下面是 Excel 透视表结果:


Python 数据透视表 计数 python处理excel数据透视表_python pandas处理excel_13


接着是 pandas 实现:


Python 数据透视表 计数 python处理excel数据透视表_python pandas处理excel_14


  • 修改 index 参数为 pclass,即可按船舱等级汇总
  • 行9:不想再重复编写那段"非人"看的占比计算,直接调用一个自定义的函数(函数实现看源码)

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


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

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


Python 数据透视表 计数 python处理excel数据透视表_Python 数据透视表 计数_15


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

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

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

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



Python 数据透视表 计数 python处理excel数据透视表_python pandas处理excel_16


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

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

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

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

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

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

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


Python 数据透视表 计数 python处理excel数据透视表_Python 数据透视表 计数_17


  • 行3:这句就是把每个人标记为"是否套票"的实现,这个不多解析了,几乎与上面说的中文语义一致
  • 行5-10:利用透视表,对字段 isgroup 统计一下生还人数比例
  • 很明显,没有小伙伴的人里面(上图结果的第一行),生还比例只有 27.21% 。相比较,有小伙伴一起上船的乘客(上图结果的第二行),生还人数比例就比较高

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