You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找并存储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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:05:00