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

Pandas嵌套groupby:仅对指定Type组按SubType二次聚合

需求说明

存在包含Value、Type、Subtype三列的DataFrame,需要实现自定义分组聚合规则:

  • 首先按Type列做一级分组
  • 对Type=="1"的一级分组,不拆分SubType维度,直接计算组内所有行Value的总和
  • 对Type=="2"的一级分组,进一步按SubType做二级分组,计算每个二级子组Value的总和

原有实现直接对全量数据按[Type, SubType]做两层分组聚合,会把Type=="1"的分组也按SubType拆分为多个子项,不符合需求,原有问题代码如下:

import pandas as pd
df = pd.DataFrame()

df["Type"] = ["1", "2", "1", "2", "1", "2"]
df["SubType"] = ["A", "A","B", "B","C", "C"]
df["Value"] = [1,2,3,4,5,6]

gb = df.groupby(["Type", "SubType"]).agg({"Value": sum})
gb

原有错误输出:

Value
Type SubType    
1    A        1
     B        3
     C        5
2    A        2
     B        4
     C        6
最优实现方案

核心思路是构造动态分组键:对不需要拆分二级维度的分组(即Type=="1"的行),将其SubType值统一替换为固定占位值,需要拆分二级维度的分组保留原SubType值,再统一做两层分组聚合即可,全程仅需一次groupby操作,无额外拆分、拼接开销,代码最简洁。

实现代码:

# 构造动态分组键:Type为2时保留原SubType,其余情况SubType统一为固定值(比如"合计")
group_cols = [
    df["Type"],
    df["SubType"].where(df["Type"] == "2", other="合计")
]

# 直接分组聚合即可得到目标结果
res = df.groupby(group_cols).agg(Value=("Value", "sum"))
print(res)

运行输出:

Value
Type SubType    
1    合计       9
2    A          2
     B          4
     C          6

可选调整

  • 如果不需要为Type=="1"的组显示SubType占位文本,可以将other参数设置为空字符串,或聚合完成后按需重置、修改索引即可
  • 如果后续新增其他Type需要适配差异化分组规则,只需要调整where方法的判断逻辑即可,扩展性强

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:42:25