pandas:从多级索引中删除一个级别?

如果我有一个多级索引:

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

我怎样才能放弃那个指数的“a”水平,所以我最终得到:

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

您可以使用MultiIndex.droplevel

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

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

 >>> df a bc 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 bc 0 1 2 1 3 4 

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

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

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

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

 df.columns = [col[1] for col in df.columns] bc 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) AB xyy 0 1 2 8 1 3 4 9 

删除顶层会留下索引为“y”的两列。 这可以通过join名单和列表理解来避免。

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

这是我做了一个groupby之后的一个问题,花了一段时间才find解决这个问题的其他问题 。 我在这里调整了解决scheme的具体情况。