我有一个熊猫数据框架,它有三层多重索引。我试图根据对应于两个级别的值列表从这个数据帧中取出行
我有这样的想法:
ix=pd.MultiIndex.from_产品([[1,2,3],'foo','bar',['baz','can']],名称=['a','b','c']))
数据=np.arange(len(ix))
df=pd.DataFrame(数据,索引=ix,列=['hi'])
打印(df)
你好
a、b、c
1富巴兹0
罐1
巴兹2号酒吧
罐3
2富巴兹4
罐5
巴兹6号酒吧
罐7
3富巴兹8
罐9
巴兹10号酒吧
罐11
现在我想取索引级别“b”和“c”在此索引中的所有行:
ix_use=pd.MultiIndex.from_元组([('foo','can'),('bar','baz')],name=['b','c'])
i、 e.hi具有('foo','can')或('bar','baz')的值分别位于b和c级别:(1,2,5,6,9,10)
因此,我想在第一层上取一个切片(None),在第二层和第三层上提取特定的元组
起初,我认为将多索引对象传递给.loc会提取出我想要的值/级别,但这不起作用。做这样的事情最好的方法是什么
以下是获取此切片的方法:
df.sort\u索引(inplace=True)
idx=pd.indexlice
df.loc[idx[:,('foo','bar'),'can'],:]
屈服
你好
a、b、c
1巴罐3
福罐1
2巴罐7
福罐5
3巴罐11
福罐9
请注意,您可能需要对多索引进行排序,然后才能对其进行切片。如果你需要的话,熊猫会提醒你:
KeyError:“多索引切片要求索引为完全lexsorted元组len(3),lexsorted depth(1)”
您可以在文档中阅读有关如何使用切片器的更多信息
如果出于某种原因,无法使用切片器,则可以使用.isin()方法获取相同的切片:
df[df.index.get_level_value('b').isin(ix_use.get_level_value(0))&;df.index.get_level_value('c').isin(ix_use.get_level_value(1))]
这显然不够简洁
更新:
对于您已更新的条件,这里有一种方法:
cond1=(df.index.get_level_值('b').isin(['foo'])&;(df.index.get_level_值('c').isin(['can']))
cond2=(df.index.get_level_值('b').isin(['bar'))&;(df.index.get_level_值('c').isin(['baz']))
df[cond1 | cond2]
制作:
你好
a、b、c
1福罐1
巴兹2号酒吧
2福罐5
巴兹6号酒吧
3福罐9
巴兹10号酒吧