如何基于另一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形状不匹配或逻辑错误报错:
- 第一种直接用
loc比较整列:两个DataFrame行数不同(df有5行,df2有4行),直接做列级比较会触发广播机制,导致形状不匹配。 - 第二种
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
相关产品推荐
相关产品推荐

