Pandas MultiIndex按索引level 0分组后保持count降序排序问题
问题原因
你的原有代码存在两个核心错误导致排序失效:
- 第二次
groupby操作的分组键顺序错误,且无必要的二次聚合会直接打乱前一步的排序结果,pandas的groupby默认会对分组键做字典序排序,不会保留输入数据的原有顺序 - 排序字段优先级设置错误:优先按
counts排序会导致不同code的同计数行混排,无法保证相同code的行聚合在一起
正确实现
场景1:code按自然顺序(0510→0511→0512...)聚合并组内降序
# 1. 统计每个code+product的出现次数 data = df.groupby(['code', 'product'], as_index=False).size().rename(columns={'size':'count'}) # 2. 排序:先按code升序保证同code聚合,再按count降序实现组内排序 sorted_df = data.sort_values(by=['code', 'count'], ascending=[True, False]) # 3. (可选)设置多级索引实现同code合并显示的效果 result = sorted_df.set_index(['code', 'product'])
场景2:code按组内最高count值降序排列(高统计量的code组整体靠前)
如果需要让count最大值更高的code组整体排在前面(比如0512组有count=2的记录,会排在只有count=1的0510、0511组前面),可以加辅助列实现:
# 1. 统计每个code+product的出现次数 data = df.groupby(['code', 'product'], as_index=False).size().rename(columns={'size':'count'}) # 2. 新增辅助列:每个code组的最大count值,用于code组的整体排序 data['code_max_cnt'] = data.groupby('code')['count'].transform('max') # 3. 排序:先按code组的最大count降序,再按code升序,最后组内count降序 sorted_df = data.sort_values(by=['code_max_cnt', 'code', 'count'], ascending=[False, True, False]).drop(columns='code_max_cnt') # 4. (可选)设置多级索引 result = sorted_df.set_index(['code', 'product'])
内容的提问来源于stack exchange,提问作者elchapo
相关产品推荐
相关产品推荐

