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

Pandas中实现Rollup:按Agent及Agent+Product_type聚合数据

实现双层分组聚合并合并结果的最优方案

嘿,这个需求我刚好处理过,用pandas可以通过分组合并+自定义排序的方式轻松搞定,代码简洁高效,还完全贴合你的目标输出。咱们一步步来:

首先先把你的示例数据转换成DataFrame:

import pandas as pd

data = {
    'Agent': ['Avi', 'Avi', 'Benny', 'Benny', 'Gilroy', 'Gilroy', 'Gilroy'],
    'Product_type': ['stA', 'stB', 'stB', 'stB', 'stA', 'stB', 'stB'],
    'Hours_worked': [20, 30, 10, 20, 10, 20, 30],
    'Total_spent': [400, 500, 500, 300, 200, 300, 100]
}
df = pd.DataFrame(data)

第一步:完成两类聚合计算

  1. 按Agent+Product_type分组求和:直接用groupby指定两个分组列,求和后保留列名(as_index=False)
# 分组1:Agent + Product_type
grouped_detail = df.groupby(['Agent', 'Product_type'], as_index=False).sum()
  1. 仅按Agent分组求和(Product_type设为"All"):先按Agent分组求和,再修改Product_type列的值
# 分组2:仅Agent,Product_type统一为"All"
grouped_all = df.groupby('Agent', as_index=False).sum()
grouped_all['Product_type'] = 'All'

第二步:合并结果并调整排序

把两个聚合结果合并,然后按照Agent和Product_type的优先级排序(让stA、stB排在All前面):

# 合并两个结果
result = pd.concat([grouped_detail, grouped_all])

# 自定义排序规则:stA > stB > All
sort_order = {'stA': 0, 'stB': 1, 'All': 2}
result['sort_key'] = result['Product_type'].map(sort_order)

# 排序后删除临时的排序键
result = result.sort_values(by=['Agent', 'sort_key'], ignore_index=True).drop('sort_key', axis=1)

最终结果

运行后得到的结果完全匹配你的目标:

AgentProduct_typeHours_workedTotal_spent
AvistA20400
AvistB30500
AviAll50900
BennystB30800
BennyAll30800
GilroystA10200
GilroystB50400
GilroyAll60900

为什么这是最优方案?

  • 效率高:pandas的groupby和concat都是底层优化过的操作,处理大数据量时性能远优于手动循环
  • 可读性强:每一步逻辑清晰,别人接手代码也能快速理解
  • 易维护:如果后续需要调整聚合规则(比如改求和为均值),只需要修改sum()部分即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:33:38