提取df1中与df2指定列匹配的行索引(基于内连接逻辑)
针对你要提取df1中与df2列'1'、'2'完全匹配的行索引的需求,我整理了几种实用的实现方案,附代码示例供你参考:
方法1:通过Merge保留原始索引
这种方法的核心是先把df1的索引转为一列,再执行内连接,最后提取对应的原始索引。好处是如果你需要同时获取匹配行的其他数据,这个方法能一次性搞定:
import pandas as pd # 初始化你的两个DataFrame df1 = pd.DataFrame({'1': [0,1,2,3,4,5], '2': [6,7,8,9,10,11], 'a': [3,6,9,12,15,18]}) df2 = pd.DataFrame({'1': [0,1,2,33,40,5], '2': [6,7,8,99,10,11], 'b': [30,60,90,120,150,180], 'c': [-1,-2,-3,-4,-5,-6]}) # 给df1添加原始索引列 df1_with_idx = df1.reset_index().rename(columns={'index': 'df1_original_index'}) # 基于列'1'和'2'执行内连接 merged_result = pd.merge(df1_with_idx, df2, on=['1', '2'], how='inner') # 提取匹配的df1行索引 matching_indices = merged_result['df1_original_index'].tolist() print(matching_indices) # 输出: [0, 1, 2, 5]
方法2:使用布尔索引直接匹配行对
如果只需要提取索引,不需要merge后的其他数据,这种方法更轻量。我们先把df2中列'1'和'2'的组合转成集合(集合的查询效率很高),再用布尔索引筛选df1中的匹配行:
# 生成df2中(列1,列2)的组合集合 df2_pairs = set(zip(df2['1'], df2['2'])) # 生成df1中每行是否匹配的布尔掩码 match_mask = df1.apply(lambda row: (row['1'], row['2']) in df2_pairs, axis=1) # 提取匹配的行索引 matching_indices = df1[match_mask].index.tolist() print(matching_indices) # 输出: [0, 1, 2, 5]
方法对比
- 方法1:最灵活,适合需要同时获取匹配行的其他数据场景,代码可读性高。
- 方法2:性能最优(尤其是大数据集),因为集合的查询是O(1)时间复杂度,仅需遍历df1一次。
内容的提问来源于stack exchange,提问作者N08
相关产品推荐
相关产品推荐

