如果我有一个多级列索引:
>>> 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
你可以使用MultiIndex.droplevel:
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]
你也可以通过重命名列来实现:
df.columns = ['a', 'b']
这涉及到一个手动步骤,但可能是一个选项,特别是如果你最终要重命名你的数据帧。
另一种方法是使用以下方式方法,基于df的横截面重新分配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
删除索引的另一种方法是使用列表推导式:
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后遇到的一个问题,它花了一段时间才找到解决它的另一个问题。我把这个解用在了具体的情况下。
我一直在努力解决这个问题,因为我不知道为什么我的droplevel()函数不工作。通过几个练习,你会发现表中的' a '是列名,' b ', ' c '是索引。这样做会有帮助吗
df.columns.name = None df.reset_index() #make index become label
一个使用level=1的sum的小技巧(当level=1是唯一的时有效)
sum
df.sum(level=1,axis=1) Out[202]: b c 0 1 2 1 3 4
更常见的解决方案get_level_values
get_level_values
df.columns=df.columns.get_level_values(1) df Out[206]: b c 0 1 2 1 3 4
从Pandas 0.24.0开始,我们现在可以使用DataFrame.droplevel ():
cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")]) df = pd.DataFrame([[1,2], [3,4]], columns=cols) df.droplevel(0, axis=1) # b c #0 1 2 #1 3 4
如果你想保持你的DataFrame方法链滚动,这是非常有用的。