如何优化对比两个DataFrame匹配email后替换unique_ID的低效代码
性能差的核心原因
你当前采用的是嵌套遍历两个DataFrame行的实现逻辑,时间复杂度为O(df1行数×df2行数),20万×9000的计算量达到18亿次,再加上iterrows本身遍历效率极低、频繁修改df1行数据的开销大,自然会运行耗时极长。
最优优化方案(向量化操作,无需循环)
采用字典映射的方式实现批量更新,全程是pandas底层的C语言级运算,耗时可以降到秒级:
- 先将df2转换为
email为键、unique_ID为值的映射字典,提前处理同一个email对应多个ID的重复数据
# keep参数可按业务需求调整:first=保留第一个出现的ID,last=保留最后一个出现的ID id_map = df2.drop_duplicates(subset='Email', keep='last').set_index('Email')['unique_ID'].to_dict()
- 用映射字典批量更新df1的unique_ID,匹配不到的保留原值:
df1['unique_ID'] = df1['email'].map(id_map).fillna(df1['unique_ID']).astype(int)
可选方案(适合有更复杂关联逻辑的场景)
如果后续还有其他关联字段需要校验,可以用merge关联实现:
# 关联两个表取对应ID merged = df1[['email']].merge(df2[['Email', 'unique_ID']], left_on='email', right_on='Email', how='left') # 替换ID,匹配不到保留原值 df1['unique_ID'] = merged['unique_ID'].fillna(df1['unique_ID']).astype(int)
注意事项
- 如果df2中同一个email不会出现多个不同的unique_ID,可以去掉
drop_duplicates步骤,直接生成映射字典即可 - 最终的
astype(int)是对齐你原逻辑中统一转整数比较的要求,如果ID本身就是整数类型可以省略
内容的提问来源于stack exchange,提问作者Ad_sh
相关产品推荐
相关产品推荐

