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
相关产品推荐
相关产品推荐

