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的具体情况。