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

Python实现无重复多列优先级排名的技术问询

嘿,我来帮你搞定这个无重复排名的需求!你想要避开df.rank(method='first'),同时让排名先按CountA降序,CountA相同时再按CountB降序来确定唯一名次,对吧?

这里有两种高效的实现方式,完全符合你的要求:

方法一:排序后映射排名(直观易读)

先按照你的规则对数据集排序,给排序后的行分配连续排名,再把排名映射回原数据集:

import pandas as pd

# 你的示例数据
data = {
    'Name': ['Alpha', 'Beta', 'Delta', 'Gamma'],
    'CountA': [15, 20, 20, 45],
    'CountB': [3, 52, 31, 43]
}
df = pd.DataFrame(data)

# 1. 按CountA降序、CountB降序排序,重置索引
sorted_df = df.sort_values(by=['CountA', 'CountB'], ascending=[False, False]).reset_index(drop=True)
# 2. 分配从1开始的连续排名
sorted_df['Rank'] = sorted_df.index + 1
# 3. 将排名合并回原DataFrame
df = df.merge(sorted_df[['Name', 'Rank']], on='Name', how='left')

# 查看结果
print(df)

运行后会得到你期望的结果:

Name  CountA  CountB  Rank
0  Alpha      15       3     4
1   Beta      20      52     2
2  Delta      20      31     3
3  Gamma      45      43     1

方法二:索引映射排名(大数据集更高效)

如果你的数据集很大,不想用merge,可以直接通过索引映射来分配排名,速度更快:

# 获取按规则排序后的原索引顺序
sorted_indices = df.sort_values(by=['CountA', 'CountB'], ascending=[False, False]).index
# 创建索引到排名的映射字典(排名从1开始)
rank_mapping = {idx: rank + 1 for rank, idx in enumerate(sorted_indices)}
# 给原DataFrame添加Rank列
df['Rank'] = df.index.map(rank_mapping)

这个方法直接操作索引,避免了合并操作,处理大型数据集时性能更优。

为什么这个方案可行?

我们没有依赖df.rank的first参数,而是通过显式排序完全掌控排名逻辑:先按CountA从高到低排,CountA相同的情况下,CountB更高的排在前面,然后给每个位置分配唯一的连续排名,确保没有重复名次。如果之后需要添加更多排序规则(比如第三列CountC),只需要修改sort_values的by参数即可,非常灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:57:39