You need to enable JavaScript to run this app. Pandas:将子分组汇总作为独立列合并为目标df的高效实现方法
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:将子分组汇总作为独立列合并为目标df的高效实现方法

通用无硬编码实现方案

原操作的核心逻辑是「获取公司维度全品类总销量 + 将公司-产品的交叉销量展开为独立列」,完全不需要逐分组筛选、逐次merge的硬编码流程,用pandas原生透视能力即可一步完成,适配任意规模的子分组数量,不存在分组扩容带来的代码量线性膨胀问题。

实现步骤

  • 计算公司维度的全品类总销量,直接对应目标表的Qty列
  • 基于pivot_table自动生成「公司-产品」交叉汇总表,无需手动枚举所有存在的Product分组值
  • 批量重命名透视表的列名,匹配Product_序号的格式要求
  • 基于公司公共索引对齐拼接总销量列与分产品列,自动将无匹配的分产品值填充为NaN,输出与原硬编码逻辑的结果完全一致

完整可运行代码

import pandas as pd
data = {"Company":["a","b","c","b","a","c","a","a","b"], 
        "Product":[3,2,2,1,4,4,3,2,1], 
        "Qty":[2,4,8,1,8,3,6,4,5]}
df = pd.DataFrame(data)

# 以Company为公共索引对齐计算,减少重复merge的开销
company_total = df.groupby("Company")["Qty"].sum()
prod_cross = df.pivot_table(
    index="Company",
    columns="Product",
    values="Qty",
    aggfunc="sum"
)
# 批量重命名列,替代逐列手动rename的硬编码
prod_cross.columns = [f"Product_{col}" for col in prod_cross.columns]
# 直接按索引对齐拼接,无需指定merge键
result = pd.concat([company_total, prod_cross], axis=1).reset_index()

输出校验

代码运行结果与你给出的目标格式完全匹配:

Company  Qty  Product_1  Product_2  Product_3  Product_4
0       a   20        NaN        4.0        8.0        8.0
1       b   10        6.0        4.0        NaN        NaN
2       c   11        NaN        8.0        NaN        3.0

注:列值显示为float是因为缺失值(NaN)无法被整数类型承载,与你原硬编码代码merge后的列类型完全一致。

方案适配优势

  • 零硬编码:无论后续新增多少个Product分组、分组值如何动态变动,代码完全不需要调整,适配超大规模的多维分组场景
  • 性能提升:相比逐行筛选、逐次merge的循环写法,原生透视聚合的运行效率比手动循环高1~2个数量级,大样本量下运行时间可从分钟级降至秒级
  • 维护成本极低:没有重复的样板筛选、重命名、merge代码,逻辑链路清晰,后续排查问题不需要逐段检查每个硬编码分组的逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 19:54:10