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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:27:25