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

Boo*_*d16 18 multiple-columns dataframe multi-level pandas

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

    a
   ---+---+---
    b | c | f
--+---+---+---
0 | 1 | 2 | 7
1 | 3 | 4 | 9
Run Code Online (Sandbox Code Playgroud)

如何按名称删除列"c"?看起来像这样:

    a
   ---+---
    b | f
--+---+---
0 | 1 | 7
1 | 3 | 9
Run Code Online (Sandbox Code Playgroud)

我试过这个:

del df['c']
Run Code Online (Sandbox Code Playgroud)

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

KeyError:'密钥长度(1)大于MultiIndex lexsort depth(0)'

Boo*_*d16 17

解决了:

df.drop('c', axis=1, level=1)
Run Code Online (Sandbox Code Playgroud)

  • 即使DataFrame似乎不再包含`c`列,当我查询`df.columns`时,显示已删除的列索引. (2认同)
  • 我想我找到了罪魁祸首。这些级别是“FrozenList”,因此不会被此操作触及。您可以使用“df.columns.remove_unused_levels()”获取最新索引。 (2认同)

Min*_*int 8

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

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

df.drop(('a', 'c'), axis = 1, inplace = True)
Run Code Online (Sandbox Code Playgroud)

或指定如下所示的级别

df.drop('c', axis = 1, level = 1)
Run Code Online (Sandbox Code Playgroud)

让我们做一个简单的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
Run Code Online (Sandbox Code Playgroud)

现在是如何从“ a”中删除“ c”

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

然后使用三级索引,将该键包含在元组中以从最低一级掉落,例如('a','c','k')

像您一样,使用单个值作为索引,它会默认在顶级索引中搜索匹配项,并在该索引上删除匹配项;如果键不在索引中,则会像您发现的那样抛出错误。

因此,在我的示例中,最好将其仅丢弃'x'

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

要删除带有第二个索引“ c”的所有列,然后指定级别

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