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

时间:2014-08-05 09:37:18

标签: pandas dataframe multiple-columns multi-level

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

    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:'密钥长度(1)大于MultiIndex lexsort depth(0)'

2 个答案:

答案 0 :(得分:15)

解决:

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

答案 1 :(得分:6)

对于多索引,我们必须使用元组指定列以删除特定列,或者指定级别以在该索引级别上删除具有该键的所有列。

而不是说删除列'c'而是删除('a','c'),如下所示:

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

或指定级别,如下所示

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

让我们制作一个简单的df来演示:

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