如何跳过多索引数据框中的列级别?

时间:2018-08-28 14:56:30

标签: python pandas dataframe multi-index

我有一个嵌套的具有3个级别的多索引数据框,我想选择第一和第三级别而不选择第二级别。可以这样做吗?

我当前的代码如下所示(已更新)。现在我收到TypeError:无法散列的类型:熊猫的“切片”,我不确定为什么。 “ D”和“ E”是我要从第3级中选择的列。

   df1_1 = data['A'].loc['B',:,'D','E']

1 个答案:

答案 0 :(得分:0)

使用pandas docs中的示例数据帧,可以将locaxis参数一起使用,或者使用切片器或IndexSlice:

设置:

def mklbl(prefix,n):
    return ["%s%s" % (prefix,i)  for i in range(n)]

miindex = pd.MultiIndex.from_product([mklbl('A',4),
                                        mklbl('B',2),
                                      mklbl('C',4),
                                       mklbl('D',2)])

micolumns = pd.MultiIndex.from_tuples([('a','foo'),('a','bar'),
                                        ('b','foo'),('b','bah')],
                                       names=['lvl0', 'lvl1'])


dfmi = pd.DataFrame(np.arange(len(miindex)*len(micolumns)).reshape((len(miindex),len(micolumns))),
                    index=miindex,
                     columns=micolumns).sort_index().sort_index(axis=1)


dfmiT = dfmi.T.copy()

dfmiT

输入数据框:

          A0                                    ...    A3                      \
          B0                             B1     ...    B0        B1             
          C0     C1      C2      C3      C0     ...    C3        C0        C1   
          D0 D1  D0  D1  D0  D1  D0  D1  D0  D1 ...    D0   D1   D0   D1   D0   
lvl0 lvl1                                       ...                             
a    bar   1  5   9  13  17  21  25  29  33  37 ...   217  221  225  229  233   
     foo   0  4   8  12  16  20  24  28  32  36 ...   216  220  224  228  232   
b    bah   3  7  11  15  19  23  27  31  35  39 ...   219  223  227  231  235   
     foo   2  6  10  14  18  22  26  30  34  38 ...   218  222  226  230  234   

让我们将.locaxis参数一起使用:

dfmiT.loc(axis=1)['A3',:,'C2']

输出:

            A3               
            B0        B1     
            C2        C2     
            D0   D1   D0   D1
lvl0 lvl1                    
a    bar   209  213  241  245
     foo   208  212  240  244
b    bah   211  215  243  247
     foo   210  214  242  246