如何在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
相关产品推荐
相关产品推荐

