如何查找并存储Pandas DataFrame中与另一DataFrame行匹配的行索引?
高效匹配DataFrame并添加对应索引的方法
核心方案:用Pandas内置向量化操作替代手动循环
完全不需要采用O(n²)的嵌套循环,Pandas的内置方法都是底层优化过的,能大幅提升效率,这里推荐两种高效实现方式:
方法一:使用merge(最推荐,效率最高)
提取prevtests的匹配列和索引,与tests做左连接,直接将匹配到的索引合并到tests中:
# 从prevtests中提取匹配列(p、n、a)和原索引,重命名索引列方便识别 prev_index_mapping = prevtests[['p', 'n', 'a']].reset_index().rename(columns={'index': 'prev_index'}) # 左连接:基于p、n、a列匹配,将prevtests的索引添加到tests中 tests = tests.merge(prev_index_mapping, on=['p', 'n', 'a'], how='left')
- 效果:
tests新增的prev_index列就是匹配到的prevtests行索引,未匹配的行该值为NaN - 优势:底层采用哈希连接,时间复杂度接近线性,远快于手动循环,且代码简洁易维护
方法二:使用复合索引映射
如果偏好字典映射的方式,可以先构建(p,n,a)到prevtests索引的映射,再批量赋值:
# 构建(p,n,a)与prevtests索引的映射字典 idx_mapping = prevtests.reset_index().set_index(['p', 'n', 'a'])['index'].to_dict() # 批量为tests添加匹配的索引列 tests['index'] = tests.apply(lambda row: idx_mapping.get((row['p'], row['n'], row['a']), None), axis=1)
- 注意:
apply的效率略低于merge,当tests行数较多时更推荐第一种方法
补充说明
你之前担心合并是低效方案,但实际上merge只会处理必要的列(p、n、a和索引),不会影响tests的其他列,而且完全不需要手动遍历,是处理这类匹配问题的标准高效手段。
内容的提问来源于stack exchange,提问作者Zoe Allen
相关产品推荐
相关产品推荐

