如何高效获取两个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
相关产品推荐
相关产品推荐

