基于合同号与组件匹配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
相关产品推荐
相关产品推荐

