看起来很简单,但我的解决方案最终变得相当复杂。
我有3级多索引的df,我想根据级别0和2选择行,而忽略级别1的值(但不删除此级别)。
df
L0 L1 L2 colA colB
A1 B1 C1 1 2
C2 3 4
B2 C1 5 6
C2 7 8
A2 B3 C1 9 10
C2 11 12
B4 C1 13 14
C2 15 16
在这里,我想基于A和C提取行,而B则不受影响。
df.loc [[A,:,C],colB]不起作用。
我通过操纵多索引级别来解决这个问题但是它非常复杂(对我来说)并且应该有更简单的解决方案。
答案 0 :(得分:3)
使用slicers:
idx = pd.IndexSlice
df1 = df.loc[idx['A1',:,'C1'],'colB']
或者:
df1 = df.loc[('A1',slice(None),'C1'),'colB']
print (df1)
L0 L1 L2
A1 B1 C1 2
B2 C1 6
Name: colB, dtype: int64
答案 1 :(得分:3)
另一种方法是将loc
与(axis=0)
一起使用pandas documenation on using slicers:
df.loc(axis=0)['A1',:,'C1']
输出:
colA colB
L0 L1 L2
A1 B1 C1 1 2
B2 C1 5 6
答案 2 :(得分:3)
pandas 0.22
中的新内容df.query('ilevel_0=="A1" & ilevel_2=="C1"')
在你的情况下它应该是
df.query('L0=="A1" & L2=="C1"')
Out[187]:
colA colB
L0 L1 L2
A1 B1 C1 1 2
B2 C1 5 6
答案 3 :(得分:2)
xs
也可以很好地完成这个任务:
df
colA colB
L0 L1 L2
A1 B1 C1 1 2
C2 3 4
B2 C1 5 6
C2 7 8
A2 B3 C1 9 10
C2 11 12
B4 C1 13 14
C2 15 16
df.xs(['A1', 'C1'], level=[0,2], drop_level=False)
colA colB
L0 L1 L2
A1 B1 C1 1 2
B2 C1 5 6