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

如何在Pandas中按MultiIndex筛选DataFrame的共享索引元素?

筛选DataFrame中与另一个DataFrame共享索引的元素

首先先明确你的两个DataFrame的创建代码和结构:

创建DataFrame代码

import pandas as pd

# 创建并设置多层索引的df_a
df_a = pd.DataFrame(data=[['A', 'B', 'C'], ['A1', 'B1', 'C1']], columns=['first', 'secound', 'third'])
df_a.set_index(['first', 'secound'], inplace=True)

# 创建并设置多层索引的df_b
df_b = pd.DataFrame(data=[['A', 'B', 12], ['A', 'B', 143], ['C1', 'C1', 11]], columns=['first', 'secound', 'data'])
df_b.set_index(['first', 'secound'], inplace=True)

原始DataFrame结构

df_a的结构:

third
first secound
A     B        C
A1    B1       C1

df_b的结构:

data
first secound
A     B        12
      B        143
C1    C1       11

你的需求是筛选出df_b中索引与df_a完全匹配的行,最终得到只包含(A,B)索引的结果。


解决方案

方法1:使用index.isin()(推荐,更高效)

直接利用多层索引的存在性判断,一步过滤:

# 筛选索引存在于df_a中的行
result = df_b[df_b.index.isin(df_a.index)]

运行后result的结构就是你想要的:

data
first secound
A     B        12
      B        143

原理:df_a.index是一个多层索引对象,df_b.index.isin(df_a.index)会生成一个布尔序列,标记df_b每一行的索引是否在df_a的索引集合中,用这个序列过滤df_b即可得到目标结果。

方法2:使用merge进行索引匹配

如果需要同时关联两个DataFrame的列,也可以用merge的索引匹配功能:

# 内连接匹配索引,然后移除不需要的列
result = df_b.merge(df_a, left_index=True, right_index=True, how='inner').drop(columns='third')

原理:通过left_index=True和right_index=True指定用索引进行连接,how='inner'只保留两个DataFrame索引重合的行,最后删除df_a带来的third列,得到目标结果。


内容的提问来源于stack exchange,提问作者Night Walker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:35