Pandas groupby分组调用rank方法生成排名顺序不符合预期
问题原因
你之前的代码写法完全用错了rank()的逻辑:
- 当你给
rank()传入多列时,pandas会对每一列单独计算排名,不会按多列优先级做整行的排序排名 - 你把两列的排名结果直接赋值给单列
rank时,实际只取到了rank_level1这一列的单独排名结果,完全没用到rank_level2的排序规则,和你要的「先按rank_level1升序、同level1下再按rank_level2升序排整体名次」的需求完全不符。
正确实现方法
直接在分组内按排序优先级排序后用累计计数生成名次即可,逻辑完全匹配你给出的expected_Rank结果:
# 1. 先按分组维度、排名优先级字段整体排序 df_sorted = df.sort_values(by=['group1', 'userId', 'rank_level1', 'rank_level2'], ascending=True) # 2. 分组内按排序后的顺序从1开始计数,即为正确排名 df_sorted['correct_rank'] = df_sorted.groupby(['group1', 'userId']).cumcount() + 1 # 3. 如果需要保留原始数据的行顺序,按原索引回排即可 df = df_sorted.sort_index()
结果验证
用你给出的样例数据跑上面的代码,生成的correct_rank和你提供的expected_Rank值完全一致:
- 分组
a/1下,rank_level1=3的行按rank_level2从小到大排序,y(-10.25)排第1、w(-9.36)排第2,和预期完全匹配 - 分组
b/1下,rank_level1=4的行中q(-25.92)比u(-4.8)数值更小,排第10、u排11,和预期完全匹配
内容的提问来源于stack exchange,提问作者SoakingHummer
相关产品推荐
相关产品推荐

