如何在pandas中基于另一DataFrame的映射为df2填充id新列
pandas 多列组合匹配映射生成新列实现方案
核心思路是先把df1里的no1、no2组合对应id的规则做成可复用的映射,再分别匹配df2的两组字段生成目标id列:
方法1:字典映射法(推荐,性能更高)
适合数据量较大的场景,避免逐行遍历开销:
# 1. 构建 (no1, no2) 组合到id的映射关系 id_map = df1.set_index(['no1', 'no2'])['id'] # 2. 分别匹配两组字段生成id1、id2 df2['id1'] = id_map.reindex(pd.MultiIndex.from_frame(df2[['no1', 'no2']])).values df2['id2'] = id_map.reindex(pd.MultiIndex.from_frame(df2[['no3', 'no4']])).values
如果数据量小,也可以用更直观的apply写法:
id_map = df1.set_index(['no1', 'no2'])['id'].to_dict() df2['id1'] = df2.apply(lambda x: id_map[(x['no1'], x['no2'])], axis=1) df2['id2'] = df2.apply(lambda x: id_map[(x['no3'], x['no4'])], axis=1)
方法2:merge拼接法
逻辑更直观,适合小数据量场景:
# 关联no1、no2生成id1 df2 = df2.merge(df1, on=['no1', 'no2'], how='left').rename(columns={'id':'id1'}) # 重命名df1字段后关联no3、no4生成id2 df2 = df2.merge(df1.rename(columns={'no1':'no3', 'no2':'no4'}), on=['no3', 'no4'], how='left').rename(columns={'id':'id2'})
两种方法输出的结果均和你给出的预期结果一致。
内容的提问来源于stack exchange,提问作者Ru11
相关产品推荐
相关产品推荐

