Pandas Multiindex选择跳过一级的行

时间:2018-01-02 15:09:05

标签: pandas

看起来很简单,但我的解决方案最终变得相当复杂。

我有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]不起作用。

我通过操纵多索引级别来解决这个问题但是它非常复杂(对我来说)并且应该有更简单的解决方案。

4 个答案:

答案 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