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)
第一步:完成两类聚合计算
- 按Agent+Product_type分组求和:直接用
groupby指定两个分组列,求和后保留列名(as_index=False)
# 分组1:Agent + Product_type grouped_detail = df.groupby(['Agent', 'Product_type'], as_index=False).sum()
- 仅按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)
最终结果
运行后得到的结果完全匹配你的目标:
| Agent | Product_type | Hours_worked | Total_spent |
|---|---|---|---|
| Avi | stA | 20 | 400 |
| Avi | stB | 30 | 500 |
| Avi | All | 50 | 900 |
| Benny | stB | 30 | 800 |
| Benny | All | 30 | 800 |
| Gilroy | stA | 10 | 200 |
| Gilroy | stB | 50 | 400 |
| Gilroy | All | 60 | 900 |
为什么这是最优方案?
- 效率高:pandas的
groupby和concat都是底层优化过的操作,处理大数据量时性能远优于手动循环 - 可读性强:每一步逻辑清晰,别人接手代码也能快速理解
- 易维护:如果后续需要调整聚合规则(比如改求和为均值),只需要修改
sum()部分即可
内容的提问来源于stack exchange,提问作者goidelg
相关产品推荐
相关产品推荐

