此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd
> 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas
前言
排名功能在日常工作是比较常用的,学生成绩排名、Kpi 绩效排名等等,可能有些小伙伴不知道存在许多排名方式的。本文我们来看看 pandas 中怎么做到 Excel 中支持的各种排名方式,还有 Excel 也不支持的排名方式!
> 本文使用的是 Excel 2010 版本
Excel 中的排名
直接列出本文所有涉及的排名,下图为 Excel 中的函数 透视表实现方式:
- 前4列是原始数据,后4列是以语文成绩列(B列)做排名的结果,
- E列 与 F列:美国式排名,前3个人是并列第一名,按道理是给他们3个人分别 1、2、3 名次,但是他们成绩一样,不可能分出高下,因此,此方式取他们组内最小的名次(1),并且2和3名次被占用,后面的人不能使用剩下的名次(注意第5个人的名次是4)
- G列:中国式排名,基本原理与美国式排名一致,但是名次2和3没有被占用,因此后面的人得到名次2
- H列:平均排名,同排名组内求平均作为他们的统一排名
- I列:如果希望按照 语文、数学、英文 3科成绩综合排名,Excel 中需要复杂的数组公式,这里不做低效事情。下面直接介绍 pandas 的实现
- J列:同上
一个方法打天下
pandas 中讲究简洁(简单直接,语义清晰),所有上面说的排名都是统一使用 rank 方法实现。
先看"按出现次序"的排名:
- 行2:调用 rank 方法,得到排名结果
- 参数 method='first' ,为按出现次序排名
- 参数 ascending=0 ,按 大到小 判断
显然,这种排名是没啥作用,因为上面的 A2、A3 这2人要吵起来了,凭啥我不能拿第一!
这时候,给他们一致的名次是很重要,下面是平均排名法:
- 参数 method 的默认值为 average ,因此不设置此参数即可实现
名次被平均了,中间缺少了一些名次,感觉怪怪的,那看看美国式排名:
- 参数 method='min',实际所谓的美国式排名,就是把他们的顺序名次取最小,作为他们的统一名次
"但是美国式排名中间还是没有了一些名次呀,只是显示的名次是比较小,看来感觉好看一些而已"
那就用中国式排名就好了:
参数 method='dense',组内名次仍然取最小值,但是组内其余的名次仍然可以被后面的人使用
"是挺方便的,但是有时候名次是要结合多个科目的成绩而定(比如先看语文成绩,相同则看数学,再相同最后看英文成绩),在 pandas 中是不是很复杂?"
在 python 中刚好有一种数据结构是使用这种递进比较规则,这就是元祖。
此时我们只需要考虑怎么把多列成绩结合成一个元祖:
- 实际代码较之前的案例代码大同小异
- 行4:df[cols].apply(tuple, axis=1),按照语数英顺序,生成一个元祖列。接着按照正常排名方式处理即可
- 从结果可以看到,前3人语文成绩一样的情况下,分别通过数学以及英文成绩作为排名依据。如果你希望修改3科成绩的比较次序,只需要简单修改 行3 的代码即可
更多复杂的高级排名应用,请关注我的 pandas 专栏,像 "带权重比较名次" 等案例,应有尽有!