You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不重置索引生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:05:19