如何高效查找两个DataFrame的交集并获取对应索引?
高效获取两个DataFrame交集的对应索引
核心方案:用merge实现向量化匹配
你的列表推导式效率低是因为做了逐行循环,改用pandas的merge(向量化操作)能大幅提升速度,同时输出格式和你要的一致。
场景1:获取df2匹配行在df1中的对应索引
把df1的索引转为列后合并,就能直接提取匹配的df1索引:
import pandas as pd # 示例数据初始化 df1 = pd.DataFrame({'a': ['book', 'book', 'pen', 'eraser', 'book'], 'b': [1,2,1,3,4]}) df2 = pd.DataFrame({'a': ['pen', 'book', 'pen', 'eraser', 'book'], 'b': [4,2,8,3,14]}) # 将df1的索引转为列,方便合并后提取 df1_with_idx = df1.reset_index().rename(columns={'index': 'df1_idx'}) # 按a、b列做内连接,只保留两边都存在的行 merged = pd.merge(df2, df1_with_idx, on=['a', 'b'], how='inner') # 得到df1中匹配行的索引,格式为pandas Index对象 matched_df1_index = merged['df1_idx']
运行结果:Int64Index([1, 3], dtype='int64'),对应df1里book-2和eraser-3的行索引。
场景2:获取df2中与df1有交集的行的索引
如果需要的是df2自身的匹配行索引,合并时保留df2的索引即可:
merged = pd.merge(df2.reset_index(), df1, on=['a', 'b'], how='inner') matched_df2_index = merged['index']
运行结果:Int64Index([1, 3], dtype='int64'),对应df2里book-2和eraser-3的行索引。
优势说明
- 速度快:
merge是pandas底层优化的操作,避免了Python层面的逐行循环,大数据量下效率提升显著。 - 格式统一:返回结果是pandas的
Index对象,和你第一个示例的输出格式完全一致,无需额外转换。
内容的提问来源于stack exchange,提问作者Qeyzho
相关产品推荐
相关产品推荐

