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

基于合同号与组件匹配DataFrame B的price列值至DataFrame A

按合同号+组件匹配DataFrame价格的解决方案

核心思路

DataFrame A是宽表结构(每个组件对应一列),DataFrame B是长表结构(一行对应一个合同号+组件的价格),需要先统一格式再完成匹配,具体步骤如下:


1. 将DataFrame A转换为长格式

把A中分散的组件列合并为「组件编码」「组件状态」两列,保留合同号作为关联标识:

import pandas as pd

# 宽表转长表
df_A_long = df_A.melt(
    id_vars=['合同号'],
    var_name='组件编码',
    value_name='组件状态'  # 对应原A中组件列的取值,如数量/是否存在标记
)

# 过滤无组件的行(按需选择)
df_A_long = df_A_long[df_A_long['组件状态'].notna() & (df_A_long['组件状态'] != 0)]

2. 与DataFrame B匹配价格

通过合同号和组件编码双字段关联,提取B中的price值:

# 合并匹配,保留A中所有行,匹配不到的price将显示为NaN
df_A_with_price = pd.merge(
    df_A_long,
    df_B[['合同号', '组件编码', 'price']],
    on=['合同号', '组件编码'],
    how='left'
)

3. 按需转回宽表(可选)

如果需要恢复原A的宽表结构,新增对应组件的价格列:

# 长表转宽表,每个组件对应一个price列
df_A_wide_price = df_A_with_price.pivot(
    index='合同号',
    columns='组件编码',
    values='price'
).reset_index()

# 与原A合并,得到最终带价格的宽表
final_df = pd.merge(df_A, df_A_wide_price, on='合同号', how='left')

关键注意事项

  • 确保两个DataFrame的合同号和组件编码格式完全一致:统一字符串/数字类型,消除大小写、空格差异
  • 若df_B存在重复的合同号+组件编码组合,先执行df_B.drop_duplicates(subset=['合同号', '组件编码'], keep='first')去重
  • 若原A的组件列是数量值,可新增总价列:df_A_with_price['总价'] = df_A_with_price['组件状态'] * df_A_with_price['price']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:47:12