Pandas多级索引DataFrame按列排序时不打乱分组索引顺序的实现
解决方案
你之前的写法不符合预期的原因是:直接对times_sold全表排序会打散1_product_id的分组,而直接调用sort_index是按索引值的大小排序,和你要的按分组最高销量排序的逻辑不符。
要实现需求,核心是增加分组级别的排序权重,按以下逻辑处理即可:
- 先完成基础的分组聚合操作
- 给每个
1_product_id分组计算该组下最高的times_sold值,作为外层分组的排序依据,保证最高销量的1_product_id整体排在前面 - 同一个
1_product_id分组内部,再按单条记录的times_sold降序排列 - 最后设置复合索引,自动合并重复的外层索引值
完整实现代码如下:
# 1. 先做分组聚合求和 df_agg = df_out.groupby(['1_product_id','2_product_id'], as_index=False).sum() # 2. 新增列:每个1_product_id对应的最大times_sold,作为外层分组的排序权重 df_agg['max_group_sold'] = df_agg.groupby('1_product_id')['times_sold'].transform('max') # 3. 先按分组最大销量降序,再按单条记录的times_sold降序,最后设置复合索引并删除辅助列 df_result = df_agg.sort_values(by=['max_group_sold', 'times_sold'], ascending=[False, False])\ .set_index(['1_product_id', '2_product_id'])\ .drop(columns='max_group_sold')
执行后输出的df_result就完全符合你预期的格式:相同的1_product_id会聚合展示,外层按每个分组的最高times_sold排序,内层单条记录也按times_sold降序排列,Pandas默认显示的DataFrame会自动隐藏重复的外层索引值。
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

