Python Pandas:如何从多级列索引中删除一列?

45

我有一个多级列的表格,像这样:

    a
   ---+---+---
    b | c | f
--+---+---+---
0 | 1 | 2 | 7
1 | 3 | 4 | 9
如何按名称删除列"c"?使其看起来像这样:
    a
   ---+---
    b | f
--+---+---
0 | 1 | 7
1 | 3 | 9

我尝试过这个:

del df['c']

但我得到了以下错误,这是有道理的:

KeyError: 'Key length (1) was greater than MultiIndex lexsort depth (0)'

3个回答

57

使用多重索引时,要通过元组指定列以删除特定列,或者指定级别以删除该索引级别上具有该键的所有列。

不要说删除列 'c',而是像下面这样说删除('a','c'):

df.drop(('a', 'c'), axis = 1, inplace = True)

或者按照以下所示指定级别

df.drop('c', axis = 1, level = 1)

让我们创建一个简单的数据框作为演示:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c"),
...                                   ("a", "f"), ('x', 'c'),('x', 'f')])
>>> df = pd.DataFrame([[1,3, 7, 21, 8], [2, 4, 9, 21, 8]], columns=cols)
>>> df
   a         x   
   b  c  f   c  f
0  1  3  7  21  8
1  2  4  9  21  8

现在让我们来看一下如何从 'a' 中删除 'c'

>>> df.drop(('a', 'c'), axis = 1)
   a      x   
   b  f   c  f
0  1  7  21  8
1  2  9  21  8

如果有三个层级的索引,那么在元组中包含该关键字以从底层删除,例如('a','c','k')

如果索引只有一个值,就像你所做的那样,默认情况下它会在顶层索引中搜索匹配项,并删除该索引上的匹配项,或者如果该键不在索引中则抛出错误,就像你发现的那样。

因此,在我的示例中,告诉它只删除“x”是可以的。

>>> df.drop('x', axis = 1)
   a      
   b  c  f
0  1  3  7
1  2  4  9

要删除所有第二个索引为'c'的列,则需要指定级别

>>> df.drop('c', axis = 1, level = 1)
   a     x
   b  f  f
0  1  7  8
1  2  9  8

49

已解决:

df.drop('c', axis=1, level=1)

7
尽管DataFrame看起来不再包含“c”列,但当我查询df.columns时,已删除的列索引仍然会显示出来。 - Makis Tsantekidis
我有同样的问题,你找到任何解决方案了吗? - Kevin Wittek
3
我觉得我找到了罪魁祸首。这些层级是FrozenList,因此不会受到这个操作的影响。你可以使用df.columns.remove_unused_levels()来获取最新的索引。 - Kevin Wittek
谢谢,@KevinWittek。这里是一段代码片段展示它的工作原理:cols = pd.MultiIndex.from_tuples( [("a", "b"), ("a", "c"), ("a", "f"), ("x", "c"), ("x", "f")] ) df = pd.DataFrame([[1, 3, 7, 21, 8], [2, 4, 9, 21, 8]], columns=cols) df.drop(["x"], inplace=True, axis=1, level=0) df.columns.remove_unused_levels().levels[0] - Vadym Tyemirov
1
你应该使用 inplace = True,但是一般情况下,pandas正在摆脱 inplace 选项,因此最好执行 df = df.drop('c', axis=1, level=1) - Barzi2001

-1

这对我不起作用。 只有在添加了'inplace=True'时它才有效。
正确的语句是df.drop('c', axis = 1, level = 1, inplace=True)


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - tturbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接