此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd
> 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas
前言
这次是一位小伙伴提出的实际问题,刚好使用 pandas 的解决思路上与 Excel 一致,因此写到这个系列中。
问题
现有一份成绩表:
- 要求把以上各学生分成10个组,让每组的平均分尽可能接近
- 汇总输出各个组的信息(有什么人,平均分多少)
- 输出分组的组间差异信息(就简单标准差即可)
这不是 IQ 题,这里直接给出一种比较直观的解决思路(不一定最优):
- 按分数,把数据做一次升序排序
- 生成一新列,值为从 0-9(共10个数字) 的循环数列
- 按循环数列分组,即可得到结果
Excel 的做法
按照惯例,先看看如果在 Excel 上是怎么得到结果(流程前2步):
- 排序使用 Excel 内置功能,不详细讲解
- 输出循环数列,可以用函数公式,但这里当然用 Excel 的内置功能即可,先得到一列0-9(先输入0、1,再下拉即可),然后把这0-9的列复制粘贴到C列中即可
- 后面的分组,统计得到结果,就不要麻烦 Excel 了,你也会烦死
pandas 中的对应实现
怎么样生成需求中的循环数列呢?pandas 上的确没有此操作,因为这实在太简单,本来 Python 就可以内置的库可以完成:
- 行1-5:自定义函数,用于生产循环数列
- 参数 end_key 指定数列的结束值,x_len 指定最终结果的数列长度
- 行2:需要使用 itertools 库,这里导入此库
- 行3:itertools.cycle 用于循环获取数据,我们给他一个数字序列(使用 range 生成),cycle 方法会不断从里面循环获取出元素
- 注意:千万不要直接把 cycle 方法转为实际序列,否则会产生死循环
- 行4:对刚刚得到的循环数列做切片
- 行5:转换成 list
- 行8:调用这个自定义函数看看效果
接下来是利用这个自定义函数生成分组依据的列,进行分组统计,得到结果:
- 行1:加载数据
- 行2:调用之前定义的函数,获取分组依据
- 行4-10:按分数排序 分组统计结果
- 行8:对每个组中的人名(name) 串在一起(','.join) ,同时求个数(count)
- 行12:修改表头
- 行15:把分组结果输出到工作表"分组信息"
- 行16:对分组结果输出一个统计信息到工作表"组差异"
排序、分组、汇总、统计到输出,就是这么简单直观。
pandas 在数据处理中的快速、便捷,体现得一览无遗!
更多 pandas 高级技巧,关注我的 pandas 专栏!
现在可以来看看生成的结果 Excel 文件:
- 这是"分组结果"
- 因为总人数为160,可以看到每组都是16人了
- 这是"组差异"
- 行3:平均每个组的分数为49.1
- 行4:每个组平均分平均差距只是1.86分,结果还可以接受
总结