首页 文章

熊猫:从多级列索引中删除一个级别?

提问于
浏览
136

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

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

6 回答

  • 30

    我一直在努力解决这个问题,因为我不知道为什么我的droplevel()函数不起作用 . 通过几个工作并了解表中的'a'是列名和'b','c'是索引 . 这样做会有所帮助

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

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

    >>> 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
    
  • 0

    您还可以通过重命名列来实现:

    df.columns = ['a', 'b']

    这涉及手动步骤,但可能是一个选项,特别是如果您最终将重命名您的数据框 .

  • 0

    删除索引的另一种方法是使用列表解析:

    df.columns = [col[1] for col in df.columns]
    
       b  c
    0  1  2
    1  3  4
    

    如果您想要组合两个级别的名称(如下面的示例,其中底层包含两个'y'),此策略也很有用:

    cols = pd.MultiIndex.from_tuples([("A", "x"), ("A", "y"), ("B", "y")])
    df = pd.DataFrame([[1,2, 8 ], [3,4, 9]], columns=cols)
    
       A     B
       x  y  y
    0  1  2  8
    1  3  4  9
    

    删除顶层会留下两列,索引为“y” . 通过将名称与列表推导相结合可以避免这种情况 .

    df.columns = ['_'.join(col) for col in df.columns]
    
        A_x A_y B_y
    0   1   2   8
    1   3   4   9
    

    这是我在做一个groupby之后遇到的一个问题,并且需要一段时间才能找到解决它的this other question . 我在这里针对具体案例调整了解决方案 .

  • 180

    使用 sum 且level = 1的小技巧(当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
    
  • 33

    你可以使用MultiIndex.droplevel

    >>> 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]
    

相关问题