Python pandas的rank()函数

转载:关于pandas的rank()函数的一点认识

原文地址:

https://zhuanlan.zhihu.com/p/87593543

一、问题:

在一张成绩表中,有班级、姓名、成绩三列,那么如何利用Python筛选出每个班级中的排名第二的学生信息?

解决这个问题,有两个关键点:第一,要进行分组计算,根据班级进行分组;第二,计算排名,在每个组中计算排名,最后筛选出排名为第二的学生信息。


二、排序问题

​ 在计算排名的场景中,对相同的成绩(例如:上图1,一班中的李四和王五同学的成绩都是30分)该如何处理它们?本人认为,一般会有三种处理方法:

(下面的介绍中,如无特别说明,均以上表中的1班的同学的成绩作为示例数据)

顺序排名,成绩相同时,谁在前,谁排名靠前(有点先到先得的意思);

图2,顺序排名中,李四和王五成绩都为30,但是李四在前,所以李四排名为2,而王五排名为3,整体的名次为1,2,3,4,5

跳跃排名,成绩相同时,排名相同,其他元素按其‘位置’排名(可参考顺序排名);

图2,跳跃排名中,李四和王五的成绩都为30,且排名都为2,但后面同学刘三、赵柳都按其出现位置进行了排名,排名分别为4和5,整体的名次,产生了跳跃,没有名次为第3的了,整体名次为:1,2,2,4,5

密集排名,成绩相同时,排名相同,其他同学依次累加(+1)。

图2,密集排名中,虽然李四和王五的成绩相同,排名相同,但后面刘三、赵柳同学都按次序依次进行了排名(+1),其整体的名次没有跳跃,变为1,2,2,3,4

示例如下:

图2

那么,在Python中如何实现上述三种类型的排名,可以利用三方库pandas中的rank方法,可以通过设置rank()函数中method参数很方便的实现。

rank()函数

DataFrame.rank(axis=0,method='average',numeric_only=None,na_option='keep',ascending=True,pct=False)

用途:沿着某个轴(0或者1)计算对象的排名

Returns:以Series或者DataFrame的类型返回数据的排名(哪个类型调用返回哪个类型)

包含有6个参数:

​ axis:设置沿着哪个轴计算排名(0或者1)

numeric_only:是否仅仅计算数字型的columns,布尔值

​ na_option:NaN值是否参与排序及如何排序(‘keep’,‘top',’bottom')

​ ascending:设定升序排还是降序排

​ pct:是否以排名的百分比显示排名(所有排名与最大排名的百分比)

这里重点研究一下method参数​ :

在本小节的开头,介绍了排名问题中的三个一般情况,即顺序排名、跳跃排名、密集排名,在rank()函数可以通过设置method的值实现上述三种排名。

method:取值可以为'average','first','min', 'max','dense',这里重点介绍一下first、min、dense

"first": 顾名思义,第一个,谁出现的位置靠前,谁的排名靠前。李四和王五的成绩都为30,但是李四出现在王五的前面,所以李四的排名靠前(当method取值为min,max,average时,都是要参考“顺序排名”的)

df['顺序排名'] = df.成绩.rank(method='first',ascending=False)

图3

"min": 当method=“min”时,成绩相同的同学,取在顺序排名中最小的那个排名作为该值的排名,李四和王五同学排名分别为2和3,那么当method为min时,取2和3的最小的那个作为第2名作为成绩30的排名。

df['跳跃排名'] = df.成绩.rank(method='min',ascending=False)

图4

"dense": 是密集的意思,即相同成绩的同学排名相同,其他依次加1即可。

df['密集排名'] = df.成绩.rank(method='dense',ascending=False)

图5

备注:

关于average,成绩相同时,取顺序排名中所有名次之和除以该成绩的个数,即为该成绩的名次;比如上述排名中,30排名为2,3,那么 30的排名 = (2+3)/2=2.5,成绩为50的同学只有1个,且排名为1,那50的排名就位1/1=1。

​关于max,和min一样也是跳跃排名的一种,成绩相同时取顺序排名中排名最大的作为该成绩的名次,在顺序排名中,30最大的排名为3,那么当参数为max时,30的排名=3,此时,李四和王五的排名都为第3名了。

例子:

如果不区分班级,对所有同学的成绩进行排名,不同的method值,排名情况如下:

图6


三、代码

rank()函数介绍完了,怎么样利用rank()函数得到各个班级排名为第二名的学生信息呢?

这里采用密集排名,完整代码如下

def get_second(x):
    return x[x.成绩.rank(method='dense', ascending=False) == 2.0]

df.groupby('班级').apply(get_second).reset_index(drop=True)

图7

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的pandas库是数据分析和处理的重要工具。以下是pandas中一些常用的函数: 1. 读取数据: - read_csv(): 从CSV文件中读取数据。 - read_excel(): 从Excel文件中读取数据。 - read_sql(): 从SQL数据库中读取数据。 - read_json(): 从JSON文件中读取数据。 - read_html(): 从HTML文件或网页中读取表格数据。 2. 数据预览和概览: - head(): 查看DataFrame的前几行。 - tail(): 查看DataFrame的后几行。 - info(): 显示DataFrame的概要信息,包括列名和数据类型等。 - describe(): 显示DataFrame的统计描述信息,包括均值、方差等。 3. 数据选择和过滤: - loc[]: 通过标签选择行和列。 - iloc[]: 通过位置选择行和列。 - isin(): 判断元素是否属于给定的列表或数组。 - query(): 使用表达式查询数据。 4. 数据清洗和处理: - dropna(): 删除包含缺失值的行或列。 - fillna(): 填充缺失值。 - drop_duplicates(): 删除重复的行。 - replace(): 替换特定值。 5. 数据排序和排名: - sort_values(): 按照指定列的值进行排序。 - sort_index(): 按照索引进行排序。 - rank(): 对值进行排名。 6. 数据聚合和分组: - groupby(): 根据某些列的值进行分组。 - agg(): 对每个组应用聚合函数。 - pivot_table(): 创建透视表。 这只是一些常用的函数pandas还有许多其他功能强大的函数可以用于数据处理和分析。你可以参考pandas官方文档以获得更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值