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

如何基于替代码DataFrame,用自定义分组与groupby.agg合并主DataFrame行

问题解决:合并主产品与替代产品的DataFrame行

错误原因

原代码抛出TypeError: unhashable type: 'Series',是因为当替代DataFrame中同一个主产品码对应多个替代码时,map函数里的altf.set_index('Material')['Alt Material'].get(x, x)会返回Series对象而非单个字符串,导致分组键group中包含不可哈希的Series元素,触发pandas分组的哈希校验错误。

解决方案

需要先构建完整的物料-主码映射字典,确保主产品码和所有替代码都映射到同一个主组标识(主产品码),再基于该标识分组聚合:

修正后代码

if alt_name != "":
    altf = pd.read_excel(io=alt_name)
    
    # 1. 构建主码到替代码列表的映射
    main_to_alts = altf.groupby('Material')['Alt Material'].apply(list).to_dict()
    
    # 2. 构建完整的物料分组映射:主码映射到自己,替代码映射到对应主码
    material_group_map = {}
    for main_mat, alts in main_to_alts.items():
        material_group_map[main_mat] = main_mat
        for alt_mat in alts:
            material_group_map[alt_mat] = main_mat
    
    # 3. 给主DataFrame添加分组键
    df['group_key'] = df['Material'].map(lambda x: material_group_map.get(x, x))
    
    # 4. 定义聚合规则:数值列求和,物料/名称去重拼接
    agg_dict = {}
    for col in df.columns:
        if col in ['Material', 'Description', 'group_key']:
            continue
        agg_dict[col] = 'sum'  # 消耗量列求和
    
    # 对物料码和名称去重后拼接,避免重复项
    agg_dict['Material'] = lambda x: ' / '.join(sorted(set(x)))
    agg_dict['Description'] = lambda x: ' / '.join(sorted(set(x)))
    
    # 5. 分组聚合并清理临时列
    out = df.groupby('group_key', as_index=False).agg(agg_dict).drop(columns='group_key')
    df = out

关键改进点

  • 双向映射:确保所有关联物料(主码+替代码)都归到同一分组,避免遗漏或分组错误
  • 去重拼接:用set自动去重,再排序拼接,符合“删除替代行重复项”的需求
  • 可哈希分组键:所有分组键都是字符串类型,彻底解决不可哈希的报错问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:09:50