在Pandas中如何基于另一列值打破排名的并列情况?
问题描述
现有DataFrame如下:
| Index | A | B | Rank |
|---|---|---|---|
| 1 | 55 | 27 | 1.0 |
| 2 | 62 | 15 | 2.5 |
| 3 | 76 | 15 | 2.5 |
| 4 | 85 | 04 | 4.0 |
其中Rank列由代码 df['Rank'] = df['B'].rank(ascending = False) 按B列降序生成,行2与行3因B值相同出现并列排名。
需求:
- 当B列值并列时,利用A列降序值打破并列,A值更高的行获得更低的排名
- 仅对并列项用A列判定,非并列项的排名仍由B列决定
期望输出:
| Index | A | B | Rank |
|---|---|---|---|
| 1 | 55 | 27 | 1.0 |
| 2 | 62 | 15 | 3.0 |
| 3 | 76 | 15 | 2.0 |
| 4 | 85 | 04 | 4.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
相关产品推荐
相关产品推荐

