如何在Pandas DataFrame中实现含并列标记的位次排名
实现带有并列标记的位次列
可以通过 Pandas 的rank()方法结合值计数来实现需求,具体步骤如下:
完整代码实现
import pandas as pd names = ['a', 'b', 'c', 'd', 'e'] points = [10, 15, 15, 12, 20] scores = pd.DataFrame({'name': names, 'points': points}) # 按points降序排序(保留完整流程) scores = scores.sort_values(by='points', ascending=False) # 计算每个分数对应的最低位次:相同分数取最小位次 scores['temp_rank'] = scores['points'].rank(ascending=False, method='min').astype(int) # 统计每个分数的出现次数 score_freq = scores['points'].value_counts() # 生成position列:并列分数添加'T'前缀,非并列保留位次数字 scores['position'] = scores.apply( lambda x: f"T{x['temp_rank']}" if score_freq[x['points']] > 1 else str(x['temp_rank']), axis=1 ) # 移除临时辅助列(可选) scores = scores.drop('temp_rank', axis=1) # 输出结果 print(scores)
关键逻辑说明
- 位次计算:使用
rank(ascending=False, method='min')实现降序位次,相同分数会获得该分数对应的最小位次(比如示例中15分的两条数据位次都是2)。 - 并列判断:通过
value_counts()统计每个分数的出现次数,次数大于1即为并列情况。 - 列值生成:用
apply()逐行处理,对并列的位次添加'T'前缀,非并列直接保留位次数字。
运行代码后会得到期望输出:
name points position 4 e 20 1 1 b 15 T2 2 c 15 T2 3 d 12 3 0 a 10 4
内容的提问来源于stack exchange,提问作者HJA24
相关产品推荐
相关产品推荐

