合并3个DataFrame:基于零件编号为物料编号分配成本
合并多DataFrame实现双成本分配方案
核心思路
通过**左连接(left join)**将主表A_df与两个成本表B1_df、B2_df依次合并,同时为两种成本分配方式的列重命名,确保结果表保留A_df所有物料编号,并对应两种成本数据。
步骤与代码示例
假设使用Python的pandas库处理(这是DataFrame操作的标准工具):
1. 导入依赖与定义示例数据
import pandas as pd # 主表:包含所有物料编号及其他信息 A_df = pd.DataFrame({ "物料编号": ["M001", "M002", "M003", "M004"], "物料名称": ["零件A", "零件B", "零件C", "零件D"] }) # 成本表1:方式1的成本数据 B1_df = pd.DataFrame({ "物料编号": ["M001", "M002", "M003"], "成本": [150, 220, 300] }) # 成本表2:方式2的成本数据 B2_df = pd.DataFrame({ "物料编号": ["M001", "M003", "M004"], "成本": [180, 320, 250] })
2. 重命名成本列(区分两种分配方式)
为避免合并后列名冲突,先给两个成本表的成本列添加专属后缀:
B1_renamed = B1_df.rename(columns={"成本": "成本_方式1"}) B2_renamed = B2_df.rename(columns={"成本": "成本_方式2"})
3. 依次合并DataFrame
使用merge方法执行左连接,确保A_df的所有物料编号都被保留:
# 第一步:合并主表与方式1的成本数据 result_df = pd.merge(A_df, B1_renamed, on="物料编号", how="left") # 第二步:合并方式2的成本数据 result_df = pd.merge(result_df, B2_renamed, on="物料编号", how="left") # 可选:将缺失的成本值填充为0(根据业务需求,也可保留NaN) result_df = result_df.fillna(0)
4. 最终结果
执行上述代码后,result_df的输出为:
物料编号 物料名称 成本_方式1 成本_方式2 0 M001 零件A 150.0 180.0 1 M002 零件B 220.0 0.0 2 M003 零件C 300.0 320.0 3 M004 零件D 0.0 250.0
进阶处理
- 如果
B1_df/B2_df存在重复的物料编号,需先做聚合处理(如求和、取平均):# 按物料编号求和成本 B1_agg = B1_df.groupby("物料编号")["成本"].sum().reset_index().rename(columns={"成本": "成本_方式1"}) - 若不想提前重命名列,可直接在
merge时使用suffixes参数:result_df = pd.merge(A_df, B1_df, on="物料编号", how="left", suffixes=("", "_方式1")) result_df = pd.merge(result_df, B2_df, on="物料编号", how="left", suffixes=("", "_方式2"))
内容的提问来源于stack exchange,提问作者duc
相关产品推荐
相关产品推荐

