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

Pandas如何基于Bucket、Count两列按优先级实现dense稠密排名

问题根因

你当前的代码默认Bucket、Count两个字段的排序方向完全一致(均为降序),如果业务需求中两个字段排序方向不同,或是Bucket为分类字符串、默认字符排序不符合优先级规则,就会得到不符合预期的结果。

解决方案

场景1:两个字段均为降序优先(Bucket值越大排名越靠前,同Bucket下Count值越大排名越靠前)

推荐用groupby.ngroup替代apply写法,性能更高:

# 先按优先级顺序排序
Priority = Priority.sort_values(by=['Bucket', 'Count'], ascending=[False, False], ignore_index=True)
# 生成dense类型的连续排名
Priority["Rank"] = Priority.groupby(['Bucket', 'Count'], sort=False).ngroup() + 1

场景2:Bucket升序优先、Count降序优先(最常见的业务需求)

调整tuple拼接逻辑,对Count取负适配升序规则:

Priority["Rank"] = Priority.apply(lambda x: (x["Bucket"], -x["Count"]), axis=1)\
             .rank(method='dense', ascending=True).astype(int)

特殊说明:Bucket为分类字符串的情况

如果Bucket是类似['高','中','低']的业务分类值,默认字符排序不符合优先级规则时,需要先转成有序分类类型:

import pandas as pd
# 按业务优先级指定分类顺序
Priority['Bucket'] = pd.Categorical(Priority['Bucket'], categories=['低', '中', '高'], ordered=True)

完成转换后再执行排名逻辑即可得到正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:54:03