如何基于替代码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
相关产品推荐
相关产品推荐

