(二十五):循环序列分组 - 图1

    此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd

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

    前言

    这次是一位小伙伴提出的实际问题,刚好使用 pandas 的解决思路上与 Excel 一致,因此写到这个系列中。

    问题

    现有一份成绩表:

    (二十五):循环序列分组 - 图2

    • 要求把以上各学生分成10个组,让每组的平均分尽可能接近

    • 汇总输出各个组的信息(有什么人,平均分多少)

    • 输出分组的组间差异信息(就简单标准差即可)

    这不是 IQ 题,这里直接给出一种比较直观的解决思路(不一定最优):

    • 按分数,把数据做一次升序排序

    • 生成一新列,值为从 0-9(共10个数字) 的循环数列

    • 按循环数列分组,即可得到结果

    Excel 的做法

    按照惯例,先看看如果在 Excel 上是怎么得到结果(流程前2步):

    (二十五):循环序列分组 - 图3

    • 排序使用 Excel 内置功能,不详细讲解

    • 输出循环数列,可以用函数公式,但这里当然用 Excel 的内置功能即可,先得到一列0-9(先输入0、1,再下拉即可),然后把这0-9的列复制粘贴到C列中即可

    • 后面的分组,统计得到结果,就不要麻烦 Excel 了,你也会烦死

    pandas 中的对应实现

    怎么样生成需求中的循环数列呢?pandas 上的确没有此操作,因为这实在太简单,本来 Python 就可以内置的库可以完成:

    (二十五):循环序列分组 - 图4

    • 行1-5:自定义函数,用于生产循环数列

    • 参数 end_key 指定数列的结束值,x_len 指定最终结果的数列长度

    • 行2:需要使用 itertools 库,这里导入此库

    • 行3:itertools.cycle 用于循环获取数据,我们给他一个数字序列(使用 range 生成),cycle 方法会不断从里面循环获取出元素

    • 注意:千万不要直接把 cycle 方法转为实际序列,否则会产生死循环

    • 行4:对刚刚得到的循环数列做切片

    • 行5:转换成 list

    • 行8:调用这个自定义函数看看效果

    接下来是利用这个自定义函数生成分组依据的列,进行分组统计,得到结果:

    (二十五):循环序列分组 - 图5

    • 行1:加载数据

    • 行2:调用之前定义的函数,获取分组依据

    • 行4-10:按分数排序 + 分组统计结果

    • 行8:对每个组中的人名(name) 串在一起(‘,’.join) ,同时求个数(count)

    • 行12:修改表头

    • 行15:把分组结果输出到工作表”分组信息”

    • 行16:对分组结果输出一个统计信息到工作表”组差异”

    排序、分组、汇总、统计到输出,就是这么简单直观。

    pandas 在数据处理中的快速、便捷,体现得一览无遗!

    更多 pandas 高级技巧,关注我的 pandas 专栏!

    现在可以来看看生成的结果 Excel 文件:

    (二十五):循环序列分组 - 图6

    • 这是”分组结果”

    • 因为总人数为160,可以看到每组都是16人了

    (二十五):循环序列分组 - 图7

    • 这是”组差异”

    • 行3:平均每个组的分数为49.1

    • 行4:每个组平均分平均差距只是1.86分,结果还可以接受

    总结

    本文重点:

    • itertools 库中有许多相当实用的功能,值得学习

    需要源码的小伙伴,公众号发送”数据处理”

    觉得写得不错,点击右下方”在看”

    如果希望从零开始学习 pandas ,那么可以看看我的 pandas 专栏。

    扫描二维码

    获取更多精彩

    数据大宇宙

    (二十五):循环序列分组 - 图8