Pandas实现A列匹配B列值时取对应行C列值生成新列D
Pandas 实现跨列匹配取数方案
以下两种实现方式可完全达成你给出的预期效果,均为向量化操作,性能远高于逐行循环查找的写法。
方案1:构建键值映射表(推荐,大表场景效率最高)
核心逻辑和Excel中match+index的计算逻辑一致:提前建立「B列值→对应行C列值」的查找映射,直接对A列做值匹配,无需逐行扫描全表。
操作步骤:
- 生成B-C列的映射字典:
# 以B列为键,对应行的C列为值生成查找字典 bc_mapping = df.set_index('B')['C'].to_dict() - 为D列赋值匹配结果:
df['D'] = df['A'].map(bc_mapping)
代入示例表计算时,生成的映射字典为{'n2': 'n4', 'n3': 'n5', 'n1': 'n6'},对A列的n1/n2/n3做映射后,得到的D列值就是n6/n4/n5,和预期输出完全一致。
方案2:关联匹配表(适合需要保留匹配溯源的场景)
如果不想构建字典,可以通过表连接的方式实现匹配,逻辑和VLOOKUP用法一致:
- 提取B、C两列生成单独的匹配临时表,去除B列重复值,避免连接时产生冗余行:
match_table = df[['B', 'C']].drop_duplicates(subset='B') - 用原表的A列和临时表的B列做左连接:
df = df.merge( match_table, left_on='A', right_on='B', how='left', suffixes=('', '_ref') ) - 将连接得到的参考C列重命名为D列,删除多余中间列:
df['D'] = df['C_ref'] df = df.drop(columns=['B_ref', 'C_ref'])
匹配行为对齐说明
- 当A列的某个值在B列中找不到匹配项时,对应D列会自动填充
NaN,和Excel中match函数找不到值返回错误的表现一致 - 当B列存在重复值时,两种方案默认都会取第一次出现的B值对应的C列值,和Excel中match函数默认返回首个匹配位置的逻辑完全相同,无需额外写特殊判断逻辑
内容的提问来源于stack exchange,提问作者Tyler Gallenbeck
相关产品推荐
相关产品推荐

