如何高效查找一个DataFrame中与另一个DataFrame匹配行的对应索引
优化实现方案
你当前的逐行遍历方案属于O(M*N)复杂度的嵌套查询,数据量较大时性能会很差,我们可以通过预聚合+映射的方式把复杂度降到O(M+N),实现更高效优雅的效果。
方案1:字典映射法(写法最简洁,可读性高)
核心思路是提前把df1中所有相同字段组合对应的索引聚合为列表,生成映射字典后直接匹配给df2:
# 1. 预聚合df1,生成【字段组合→对应索引列表】的映射字典 idx_map = df1.reset_index().groupby(['Name', 'Place', 'Price'])['index'].agg(list).to_dict() # 2. 为df2匹配索引列表,无匹配则返回空列表 df2['Index'] = df2.apply( lambda row: idx_map.get((row['Name'], row['Place'], row['Price']), []), axis=1 )
方案2:全向量化merge法(性能最高,适合超大数据集)
如果两个DataFrame的数据量达到十万级以上,可以用完全避免逐行操作的merge方案,性能提升更明显:
# 1. 为df1增加原索引列 df1_with_idx = df1.reset_index(names='orig_idx') # 2. 按匹配字段关联两个DataFrame,按df2的原索引分组聚合索引列表 merged = df2.reset_index().merge(df1_with_idx, on=['Name', 'Place', 'Price'], how='left') df2['Index'] = merged.groupby('index')['orig_idx'].agg( lambda x: x.dropna().astype(int).tolist() ).tolist()
两种方案运行后得到的df2都完全符合预期输出效果。
内容的提问来源于stack exchange,提问作者Vineet
相关产品推荐
相关产品推荐

