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

如何高效获取两个DataFrame匹配行的索引

高效获取DataFrame匹配行索引的方案

问题场景

现有两个包含唯一值的DataFrame,其中一列存在部分匹配数据:

import pandas as pd

data_a = ['a', 'b', 'c', 'd', 'e', 'f']
data_b = ['b', 'd', 'f', 'h']
df1 = pd.DataFrame(data_a, columns=['data'])
df2 = pd.DataFrame(data_b, columns=['data'])

需要快速获取df2每行数据在df1中对应匹配行的索引,无匹配项返回None或负值,期望结果:

indices = [1, 3, 5, None]

高效实现方案

方法1:字典映射(最优效率)

利用字典的O(1)查找特性,构建值到索引的映射关系,是比循环快得多的方案:

# 构建df1中data值对应索引的字典
value_to_idx = df1['data'].reset_index().set_index('data')['index'].to_dict()

# 对df2的data列做映射,无匹配自动返回None
indices = df2['data'].map(value_to_idx).tolist()

执行后indices的结果就是[1, 3, 5, None],完全符合需求。

方法2:Merge关联查询

如果需要保留DataFrame格式,也可以用merge实现:

# 关联两个DataFrame,保留df2的所有行
merged_df = df2.merge(df1.reset_index(), on='data', how='left')
# 提取索引列,空值替换为None(或指定负值)
indices = merged_df['index'].fillna(None).tolist()

补充说明

  • 字典映射的时间复杂度为O(n),远优于循环遍历的O(n*m),数据量越大效率优势越明显。
  • 因题目明确数据列值唯一,无需处理多匹配场景,映射关系是一对一的。
  • 若需要将无匹配项替换为负值(如-1),可修改代码:
    indices = df2['data'].map(value_to_idx).fillna(-1).astype(int).tolist()
    
    结果会变为[1, 3, 5, -1]

内容的提问来源于stack exchange,提问作者Avi T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:04:59