如何高效将df2匹配id对应的标签列合并到含重复id的df1,替代慢速循环
高效实现两个数据框按ID匹配打标签的方法
你当前使用的嵌套循环时间复杂度为O(n*m),30万行df1乘2万行df2的总运算量高达60亿次,是运行耗时极长的核心原因。使用pandas内置的矢量化匹配操作即可解决问题,30万行数据仅需几秒即可跑完。
方法1:使用merge左连接实现(最常用)
逻辑和你原有需求完全对齐:保留df1的所有行,按id匹配df2的标签,未匹配到的id标签默认填充为0
import pandas as pd # 先修正df2的列名笔误(你示例中df2第三列写为labe3,实际应为label3,若实际列名正确可跳过此步) df2 = df2.rename(columns={'labe3': 'label3'}) # 以df1为基准左连接df2的标签列 df1_with_label = df1.merge( df2[['id', 'label1', 'label2', 'label3']], on='id', how='left' ) # 未匹配到的标签填充为0,转换为整数类型和原有逻辑对齐 df1_with_label[['label1', 'label2', 'label3']] = df1_with_label[['label1', 'label2', 'label3']].fillna(0).astype(int)
如果不需要保留df1中未匹配到df2 id的行,将how='left'改为how='inner'即可。
方法2:使用映射表实现
将df2转换为id到标签的映射字典,再给df1的id匹配对应值,效率和merge基本一致
# 构造id到标签的映射字典 label_map = df2.set_index('id')[['label1', 'label2', 'label3']].to_dict('index') df1_with_label = df1.copy() # 匹配标签并填充空值 df1_with_label[['label1', 'label2', 'label3']] = df1['id'].map(label_map).apply(pd.Series).fillna(0).astype(int)
两种方法的底层都是基于哈希表匹配,时间复杂度仅为O(n+m),对比嵌套循环性能提升上万倍。
内容的提问来源于stack exchange,提问作者jeny ericsoon
相关产品推荐
相关产品推荐

