您的位置 首页 > 数码极客

python如何解决并列名次

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

转发本文并私信我"Python",即可获得Python资料以及更多系列文章(持续更新的)

经常听别人说 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 专栏,像 "带权重比较名次" 等案例,应有尽有!


总结

本文重点:

  • Series.rank 方法,能实现多种方式的排名

需要源码的小伙伴请转发本文并私信我"python"

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

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“python如何解决并列名次”边界阅读