如果我有一个多级列索引:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
    a
   ---+--
    b | c
--+---+--
0 | 1 | 2
1 | 3 | 4

我如何删除索引的“a”级别,所以我最终得到:

    b | c
--+---+--
0 | 1 | 2
1 | 3 | 4

当前回答

另一种方法是根据df的横截面重新分配df,使用.xs方法。

>>> df

    a
    b   c
0   1   2
1   3   4

>>> df = df.xs('a', axis=1, drop_level=True)

    # 'a' : key on which to get cross section
    # axis=1 : get cross section of column
    # drop_level=True : returns cross section without the multilevel index

>>> df

    b   c
0   1   2
1   3   4

其他回答

一个使用level=1的sum的小技巧(当level=1是唯一的时有效)

df.sum(level=1,axis=1)
Out[202]: 
   b  c
0  1  2
1  3  4

更常见的解决方案get_level_values

df.columns=df.columns.get_level_values(1)
df
Out[206]: 
   b  c
0  1  2
1  3  4

另一种方法是根据df的横截面重新分配df,使用.xs方法。

>>> df

    a
    b   c
0   1   2
1   3   4

>>> df = df.xs('a', axis=1, drop_level=True)

    # 'a' : key on which to get cross section
    # axis=1 : get cross section of column
    # drop_level=True : returns cross section without the multilevel index

>>> df

    b   c
0   1   2
1   3   4

我一直在努力解决这个问题,因为我不知道为什么我的droplevel()函数不工作。通过几个练习,你会发现表中的' a '是列名,' b ', ' c '是索引。这样做会有帮助吗

df.columns.name = None
df.reset_index() #make index become label

你也可以通过重命名列来实现:

df。列= ['a', 'b']

这涉及到一个手动步骤,但可能是一个选项,特别是如果你最终要重命名你的数据帧。

你可以使用multiindex . dropllevel:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
>>> df
   a   
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
>>> df
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]