如何利用MultiIndex数据框的索引对目标DataFrame进行切片筛选?
解决方法:筛选DataFrame中与MultiIndex索引匹配的行
嘿,我明白你的需求了——你想从foo里挑出那些bar和baz列的组合正好出现在foo_multi的MultiIndex里的行对吧?这里有几个简单且高效的方法,你可以根据自己的习惯选:
方法1:用merge做内连接(最直观)
把foo_multi的MultiIndex转换成普通DataFrame,然后和foo做内连接,这样只会保留两边都存在的(bar, baz)组合:
import pandas as pd foo = pd.DataFrame({'bar':[1,2,3,4,5,3,8,4,4,5], 'baz':['a','b','c','d','d','d','d','b','a','a'], 'qux':['z','x','c','x','z','z','x','c','c','c']}) foo_multi = foo.groupby(['bar', 'baz']).size().nlargest(3) # 将MultiIndex转为包含bar和baz的DataFrame multi_index_df = foo_multi.reset_index() # 内连接,只保留匹配的行 result = pd.merge(foo, multi_index_df[['bar', 'baz']], on=['bar', 'baz']) print(result)
方法2:用isin结合元组筛选(无需额外DataFrame)
把foo的bar和baz列打包成元组,直接检查这些元组是否在foo_multi的索引集合里:
# 把每行的bar和baz转为元组 foo_tuples = foo.apply(lambda row: (row['bar'], row['baz']), axis=1) # 筛选出元组在foo_multi索引中的行 result = foo[foo_tuples.isin(foo_multi.index)] print(result)
方法3:通过设置临时MultiIndex筛选
先给foo设置bar和baz为MultiIndex,然后用索引匹配筛选,最后恢复原结构:
# 临时将foo的索引设为bar和baz foo_temp = foo.set_index(['bar', 'baz']) # 筛选索引在foo_multi索引中的行,再重置索引恢复列 result = foo_temp[foo_temp.index.isin(foo_multi.index)].reset_index() print(result)
这三个方法都能得到你想要的结果,选哪个全看你觉得哪种更顺手~
内容的提问来源于stack exchange,提问作者Mike S
相关产品推荐
相关产品推荐

