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

在Pandas中如何基于另一列值打破排名的并列情况?

问题描述

现有DataFrame如下:

IndexABRank
155271.0
262152.5
376152.5
485044.0

其中Rank列由代码 df['Rank'] = df['B'].rank(ascending = False) 按B列降序生成,行2与行3因B值相同出现并列排名。

需求:

  • 当B列值并列时,利用A列降序值打破并列,A值更高的行获得更低的排名
  • 仅对并列项用A列判定,非并列项的排名仍由B列决定

期望输出:

IndexABRank
155271.0
262153.0
376152.0
485044.0
解决方案

可以通过多列排序后重新计算排名的方式实现需求,核心逻辑是先按B列降序、再按A列降序排序,之后用rank(method='first')生成唯一排名,同时保留非并列项的原排名逻辑。

代码实现:

# 按B降序、A降序排序,让B相同的行中A值高的排在前面
sorted_df = df.sort_values(by=['B', 'A'], ascending=[False, False])
# 对B列降序排名,method='first'按排序顺序分配唯一排名
sorted_df['Rank'] = sorted_df['B'].rank(ascending=False, method='first')
# 恢复原DataFrame的索引顺序
df = sorted_df.sort_index()

逻辑说明:

  • sort_values 先按B列降序排列,B值相同的行再按A列降序排列,确保并列组内A值高的行优先
  • rank(ascending=False, method='first') 会给排序后先出现的行分配更低的排名,正好满足A值高的行排名更低的要求
  • sort_index() 恢复原始数据的索引顺序,保证结果结构与原DataFrame一致

执行上述代码后,得到的Rank列与期望输出完全匹配。

内容的提问来源于stack exchange,提问作者junfan02

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:55:11