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

如何基于另一DataFrame多列值在目标DataFrame中新增列?

问题:基于多列匹配从另一个DataFrame提取值新增列

先给出两个目标DataFrame的定义:

import pandas as pd

data = {
  'Part' : ['part1', 'part2', 'part3', 'part4', 'part5'],
  'Number' : ['123', '234', '345', '456', '567'],
  'Code' : ['R2', 'R2', 'R4', 'R5', 'R5']
}
df = pd.DataFrame(data, dtype = object)

data2 = {
  'Part' : ['part1', 'part2', 'part6', 'part4'],
  'Number' : ['123', '234', '345', '456'],
  'Code' : ['M2', 'R2', 'R4', 'M5']
}
df2 = pd.DataFrame(data2, dtype = object)

需求:在df中新增一列Old_Code,当df与df2的Part和Number列值同时匹配时,填入df2的Code列值,预期结果为['M2', 'R2', NaN, 'M5', NaN]。

你尝试的两种方法都因DataFrame形状不匹配或逻辑错误报错:

  1. 第一种直接用loc比较整列:两个DataFrame行数不同(df有5行,df2有4行),直接做列级比较会触发广播机制,导致形状不匹配。
  2. 第二种apply方法:函数里拿单行的Part/Number和df2的整列比较,得到的是布尔数组,无法作为if的判断条件,因此报错。

解决方法

方法一:使用merge(推荐,适合大数据量)

merge是pandas处理多键匹配最规范的方式,左连接可以保留原DataFrame的所有行,未匹配项自动填充NaN:

# 提取df2中用于匹配的列和目标Code列
mapping_df = df2[['Part', 'Number', 'Code']]
# 左连接,基于Part和Number匹配,保留df的所有行
merged_df = df.merge(mapping_df, on=['Part', 'Number'], how='left', suffixes=('', '_old'))
# 将匹配到的Code值赋值给新列Old_Code
df['Old_Code'] = merged_df['Code_old']

执行后df的Old_Code列就是预期结果。

方法二:使用元组映射(适合小数据量)

将df2的Part和Number组合成元组作为索引,再通过map匹配:

# 创建(Part, Number)到Code的映射字典
code_mapping = df2.set_index(['Part', 'Number'])['Code']
# 对df每一行生成元组,用get方法匹配,未匹配返回None(自动转为NaN)
df['Old_Code'] = df.apply(lambda row: code_mapping.get((row['Part'], row['Number'])), axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:20:23