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

基于层级的Pandas多列分组后排序问题求助

解决Pandas分组后按层级汇总值排序的问题

需求说明

需要对Pandas分组聚合后的结果按以下层级逻辑排序:

  • 第一优先级:按A分组的总V值降序排列(示例中A1总V更大,应排在最前)
  • 第二优先级:在每个A分组内,按B分组的总V值降序排列
  • 第三优先级:在每个B分组内,按C对应的V值降序排列

示例数据

import pandas as pd

df = pd.DataFrame({'A':['A1','A1','A1','A2','A2','A2','A1','A1'],
                   'B':['B2','B1','B1','B1','B1','B2','B2','B2'],
                   'C':['C1','C3','C1','C3','C2','C2','C1','C3'],
                   'V':[100,240,110,120,50,60,40,40]})

原方案问题

直接使用sort_values(by=['A','V','B','V'])只能基于分组后单个C对应的V值排序,无法利用层级的汇总值,导致排序结果不符合预期。

解决方案

通过计算各层级的汇总值作为辅助列,基于辅助列排序后再清理即可:

# 1. 基础分组聚合,先将多级索引转为普通列
grouped = df.groupby(['A','B','C']).agg(V_sum=('V','sum')).reset_index()

# 2. 计算各层级的汇总值,匹配到每一行
# A分组的总V值
grouped['A_total'] = grouped.groupby('A')['V_sum'].transform('sum')
# 每个A分组内B的总V值
grouped['B_total'] = grouped.groupby(['A','B'])['V_sum'].transform('sum')

# 3. 按需求排序,恢复多级索引并删除辅助列
sorted_result = grouped.sort_values(
    by=['A_total', 'B_total', 'V_sum'],
    ascending=[False, False, False]
).set_index(['A','B','C']).drop(columns=['A_total', 'B_total'])

print(sorted_result)

输出结果

V_sum
A   B   C   
A1  B1  C3  240
    B1  C1  110
    B2  C1  140
    B2  C3  40
A2  B1  C3  120
    B1  C2  50
    B2  C2  60

关键说明

  • transform('sum')可以在保留原数据结构的同时,将对应层级的汇总值匹配到每一行,避免破坏分组结构
  • 排序完成后恢复多级索引,并删除辅助列,得到整洁的最终结果

内容的提问来源于stack exchange,提问作者Rajib Lochan Sarkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:37:38