十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本文转载自微信公众号「AI入门学习」,作者小伍哥 。转载本文请联系AI入门学习公众号。

邵武ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
所谓的排名,就是一组数据,我们想要知道每一条数据在整体中的名次,需要的是输出名次,并不改变原数据结构。
排序会改变原来的数据结构,且不会返回名次,这一点区别需要弄明白。初学的时候容易弄混淆。
本文将通过一个实例,讲清楚Pandas中rank()排名函数的应用。下面是案例数据,包括我、张三以及唐宋八大家的语文考试成绩。
- import pandas as pd
 - data = pd.DataFrame({'班级':['1班','1班','1班','1班','1班','2班','2班','2班','2班','2班'],
 - '姓名':['韩愈','柳宗元','欧阳修','苏洵','苏轼','苏辙','曾巩','王安石','张三','小伍哥'],
 - '成绩':[80,70,70,40,10,60,60,50,50,40]})
 - #姓名长度不一样的,加个符号调整下,这该死的强迫症
 - data['姓名'] = data['姓名'].str.rjust(3,'〇')
 
Pandas中的排名,函数为rank(),使用也比较简单,需要注意的是各种排名的差异,需要进行充分理解,这样在实际应用中才不会出错。
函数用法:
- DataFrame.rank(axis=0,method='average',numeric_only=None,
 - na_option='keep',ascending=True,pct=False)
 
参数说明:
axis:0或'index',1或'columns',默认0,沿着行或列计算排名
method:'average','min','max','first','dense',默认为'average',如何对具有相同值(即ties)的记录组进行排名:
numeric_only:bool,是否仅仅计算数字型的columns,布尔值
na_option:{'keep','top','bottom'},默认为'keep',NaN值是否参与排名及如何排名
ascending:bool,默认为True,元素是否应该按升序排名。
pct:bool,默认为False,是否以百分比形式显示返回的排名。
所有的参数中,最核心的参数是method,一共5种排名方法,下面对这5种方法进行对比,应用的时候更好的去选择。
当method='first'时,当里两个人的分数相同时,分数相同的情况下,谁先出现谁的排名靠前(当method取值为min,max,average时,都是要参考“顺序排名”的),表中的柳宗元和欧阳修分数相同,但是柳宗元在表格的前面,所以排名第2,欧阳修排名第3。
| 
 班级  | 
 姓名  | 
 成绩  | 
 成绩(method='first')  | 
| 
 1班  | 
 〇韩愈  | 
 50  | 
 1  | 
| 
 1班  | 
 柳宗元  | 
 30  | 
 2  | 
| 
 1班  | 
 欧阳修  | 
 30  | 
 3  | 
| 
 1班  | 
 〇苏洵  | 
 20  | 
 4  | 
| 
 1班  | 
 〇苏轼  | 
 10  | 
 5    | 
代码如下:
- #为了简化,我们只选择1班的成绩来看
 - data_1 = data[data['班级']=='1班']
 - data_1['成绩_first'] = data_1['成绩'].rank(method='first',ascending=False)
 - data_1
 - 班级 姓名 成绩 成绩_first
 - 0 1班 〇韩愈 50 1.0
 - 1 1班 柳宗元 30 2.0
 - 2 1班 欧阳修 30 3.0
 - 3 1班 〇苏洵 20 4.0
 - 4 1班 〇苏轼 10 5.0
 
当method='min'时,成绩相同的同学,取在顺序排名中最小的那个排名作为该值的排名,会出现名次跳空,柳宗元和欧阳修分数相同,在上面的排名中,分别排第2、第3,所以这里取两个中最小的为排名名次2作为共同的名次。
| 
 班级  | 
 姓名  | 
 成绩  | 
 成绩(method='min')  | 
| 
 1班  | 
 〇韩愈  | 
 50  | 
 1  | 
| 
 1班  | 
 柳宗元  | 
 30  | 
 2  | 
| 
 1班  | 
 欧阳修  | 
 30  | 
 2  | 
| 
 1班  | 
 〇苏洵  | 
 20  | 
 4  | 
| 
 1班  | 
 〇苏轼  | 
 10  | 
 5  | 
代码如下:
- data_1 = data[data['班级']=='1班']
 - data_1['成绩_min'] = data_1['成绩'].rank(method='min',ascending=False)
 - data_1
 - 班级 姓名 成绩 成绩_min
 - 0 1班 〇韩愈 50 1.0
 - 1 1班 柳宗元 30 2.0
 - 2 1班 欧阳修 30 2.0
 - 3 1班 〇苏洵 20 4.0
 - 4 1班 〇苏轼 10 5.0
 
当method='max'时,与上面的min相反,成绩相同的同学,取在顺序排名中最大的那个排名作为该值的排名,,会出现名次跳空,柳宗元和欧阳修分数相同,在顺序排名中,分别排第2、第3,所以这里取两个中最大的为排名名次3作为共同的名次。
| 
 班级  | 
 姓名  | 
 成绩  | 
 成绩_max  | 
| 
 1班  | 
 〇韩愈  | 
 50  | 
 1  | 
| 
 1班  | 
 柳宗元  | 
 30  | 
 3  | 
| 
 1班  | 
 欧阳修  | 
 30  | 
 3  | 
| 
 1班  | 
 〇苏洵  | 
 20  | 
 4  | 
| 
 1班  | 
 〇苏轼  | 
 10  | 
 5    | 
代码如下:
- data_1 = data[data['班级']=='1班']
 - data_1['成绩_max'] = data_1['成绩'].rank(method='max',ascending=False)
 - data_1
 - 班级 姓名 成绩 成绩_max
 - 0 1班 〇韩愈 50 1.0
 - 1 1班 柳宗元 30 3.0
 - 2 1班 欧阳修 30 3.0
 - 3 1班 〇苏洵 20 4.0
 - 4 1班 〇苏轼 10 5.0
 
method='dense',dense是稠密的意思,即相同成绩的同学排名相同,其他依次加1即可,不会出现名次跳空的情况。柳宗元和欧阳修分数相同,在上面的排名中,分别排第2、第3,取相同排名2,这个看上去和min一样的,但是下一名的排名发生了变化,〇苏洵同学从第4名排到了第3名,排名数字连续的,没有跳跃。
| 
 班级  | 
 姓名  | 
 成绩  | 
 成绩_dense  | 
| 
 1班  | 
 〇韩愈  | 
 50  | 
 1  | 
| 
 1班  | 
 柳宗元  | 
 30  | 
 2  | 
| 
 1班  | 
 欧阳修  | 
 30  | 
 2  | 
| 
 1班  | 
 〇苏洵  | 
 20  | 
 3  | 
| 
 1班  | 
 〇苏轼  | 
 10  | 
 4    | 
代码如下:
- data_1 = data[data['班级']=='1班']
 - data_1['成绩_dense'] = data_1['成绩'].rank(method='dense',ascending=False)
 - data_1
 - 班级 姓名 成绩 成绩_dense
 - 0 1班 〇韩愈 50 1.0
 - 1 1班 柳宗元 30 2.0
 - 2 1班 欧阳修 30 2.0
 - 3 1班 〇苏洵 20 3.0
 - 4 1班 〇苏轼 10 4.0
 
当method='average'或者默认值时,成绩相同时,取顺序排名中所有名次之和除以该成绩的个数,即为该成绩的名次;比如上述排名中,30排名为2,3,那么 30的排名 = (2+3)/2=2.5,成绩为50的同学只有1个,且排名为1,那50的排名就位1/1=1。
| 
 班级  | 
 姓名  | 
 成绩  | 
 成绩_average  | 
| 
 1班  | 
 〇韩愈  | 
 50  | 
 1  | 
| 
 1班  | 
 柳宗元  | 
 30  | 
 2.5  | 
| 
 1班  | 
 欧阳修  | 
 30  | 
 2.5  | 
| 
 1班  | 
 〇苏洵  | 
 20  | 
 4  | 
| 
 1班  | 
 〇苏轼  | 
 10  | 
 5    | 
代码如下:
- data_1 = data[data['班级']=='1班']
 - data_1['成绩_average'] = data_1['成绩'].rank(method='average',ascending=False)
 - data_1
 - 班级 姓名 成绩 成绩_average
 - 0 1班 〇韩愈 50 1.0
 - 1 1班 柳宗元 30 2.5
 - 2 1班 欧阳修 30 2.5
 - 3 1班 〇苏洵 20 4.0
 - 4 1班 〇苏轼 10 5.0
 
综合上面的所有排名类型类型整体对比看看:
| 
 班级  | 
 姓名  | 
 成绩  | 
 rank  | 
 rank_min  | 
 rank_max  | 
 rank_first  | 
 rank_dense  | 
| 
 1班  | 
 〇韩愈  | 
 50  | 
 1  | 
 1  | 
 1  | 
 1  | 
 1  | 
| 
 1班  | 
 柳宗元  | 
 30  | 
 2.5  | 
 2  | 
 3  | 
 2  | 
 2  | 
| 
 1班  | 
 欧阳修  | 
 30  | 
 2.5  | 
 http://zsjierui.cn/article/ccciiep.html  |