不重置索引生成DataFrame各列排名的替代实现方法
实现列排名的其他方法
除了排序后重置索引的方式,用pandas原生的rank()函数是更直接高效的方案,代码简洁且能灵活处理排名规则。
原始数据
import pandas as pd df = pd.DataFrame([['Jim', 93, 87, 66], ['Bob', 88, 90, 65], ['Joe', 72, 100, 70]], columns=['Name', 'Overall', 'Stopping', 'Playing'])
方法一:使用pandas.DataFrame.rank()
直接对目标列调用rank(),通过参数控制排名规则:
ascending=False:设置分数越高排名越靠前method='min':确保相同分数取最小排名(本例无重复值,可省略,但有重复值时能规范排名逻辑)astype(int):将默认的浮点型排名转为整数
代码实现:
# 复制原始DataFrame避免修改原数据 df_ranked = df.copy() # 指定需要计算排名的列 rank_columns = ['Overall', 'Stopping', 'Playing'] # 计算排名并赋值 df_ranked[rank_columns] = df[rank_columns].rank(ascending=False, method='min').astype(int) # 输出结果 print(df_ranked)
执行后得到的结果完全符合需求:
Name Overall Stopping Playing 0 Jim 1 3 2 1 Bob 2 1 3 2 Joe 3 2 1
方法二:借助scipy.stats.rankdata(需额外导入库)
如果需要更底层的排名计算,也可以用scipy的rankdata函数,通过反转排名实现降序:
from scipy.stats import rankdata df_ranked = df.copy() rank_columns = ['Overall', 'Stopping', 'Playing'] for col in rank_columns: # rankdata默认升序,通过(len(df)+1 - 排名)转为降序 df_ranked[col] = len(df) + 1 - rankdata(df[col], method='min').astype(int)
这种方法需要导入scipy库,不如pandas原生方法便捷,适合已经使用scipy的场景。
内容的提问来源于stack exchange,提问作者code_machine
相关产品推荐
相关产品推荐

