Pandas如何基于替代映射合并DataFrame行:拼接指定列、其余列求和
Pandas 替代料数据合并实现方案
核心逻辑是先将所有存在替代关联的产品归为同一分组,再按分组执行聚合:编码、名称类文本字段用/拼接,月度消耗类数值字段求和,无替代关系的产品自动保留原行,天然支持单个主编码对应多个替代项的场景。
完整实现代码
import pandas as pd # -------------------------- # 以下为样例测试数据,实际使用替换为你自己的DataFrame即可 # -------------------------- # 主物料消耗DataFrame df_main = pd.DataFrame({ 'product code': ['123', '134', '456', '467', '789'], 'Name': ['螺丝M3', '螺丝M3(替代款)', '螺母M5', '螺母M5(替代款)', '垫片Φ6'], 'Consumption A': [100, 20, 50, 10, 300], 'Consumption B': [120, 30, 60, 15, 280], 'Consumption C': [90, 15, 45, 8, 320], 'Consumption D': [110, 25, 55, 12, 290] }) # 替代关系映射表,此处特意加入123对应两个替代项验证多替代场景适配 df_alt_map = pd.DataFrame({ 'Product Code': ['123', '123', '456'], 'Alt Code': ['134', '135', '467'] }) # -------------------------- # 核心处理逻辑 # -------------------------- # 1. 构建编码与所属分组的映射关系,统一用主编码作为分组唯一标识 code_to_group = {} # 先录入所有主编码的分组映射 for main_code in df_alt_map['Product Code'].unique(): code_to_group[main_code] = main_code # 再录入所有替代编码到对应主编码分组的映射 for _, row in df_alt_map.iterrows(): code_to_group[row['Alt Code']] = row['Product Code'] # 2. 给主表增加分组键,无替代关系的物料分组键为自身编码 df_main['group_key'] = df_main['product code'].apply(lambda x: code_to_group.get(x, x)) # 3. 自动匹配字段生成聚合规则,无需硬编码消耗列名 agg_config = { # 编码、名称字段去重后用/拼接 'product code': lambda x: '/'.join(x.drop_duplicates()), 'Name': lambda x: '/'.join(x.drop_duplicates()) } # 所有Consumption开头的消耗字段统一求和 consume_columns = [col for col in df_main.columns if col.startswith('Consumption')] for col in consume_columns: agg_config[col] = 'sum' # 4. 分组聚合得到最终结果 df_final = df_main.groupby('group_key', as_index=False).agg(agg_config).drop(columns='group_key')
输出效果说明
执行代码后得到的df_final结果符合需求:
- 存在替代关系的123、134、135合并为单行,
product code字段值为123/134/135,名称为对应物料名拼接,所有消耗列为三个物料的消耗总和 - 存在替代关系的456、467合并为单行,规则同上
- 无替代关系的789行完整保留,数值、文本字段无变化
补充说明:如果业务中存在多层嵌套替代(例如A是B的主码、B是C的主码),只需要在构建
code_to_group映射前,先对替代映射表做一次传递闭包处理,把所有层级的替代码都扁平化挂到最顶层主码下即可,当前代码完全适配你描述的「主编码在第一列、所有替代编码直接记录在Alt Code列」的扁平映射规则。
内容的提问来源于stack exchange,提问作者amanmore
相关产品推荐
相关产品推荐

