【问题标题】:Python Pandas: drop a column from a multi-level column index?Python Pandas:从多级列索引中删除一列?
【发布时间】:2014-09-27 22:10:56
【问题描述】:

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

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

【问题讨论】:

    标签: pandas dataframe multiple-columns multi-level


    【解决方案1】:

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

    而不是说drop column 'c'说drop ('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
    

    【讨论】:

      【解决方案2】:

      已解决:

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

      【讨论】:

      • 尽管 DataFrame 似乎不再包含 c 列,但当我查询 df.columns 时,已删除的列索引会显示出来。
      • 我也遇到了同样的问题,你找到解决办法了吗?
      • 我想我找到了罪魁祸首。级别是FrozenList,因此不会被此操作触及。您可以使用df.columns.remove_unused_levels() 获取最新索引。
      • Tnx,@KevinWittek。这是一个 sn-p 来展示它是如何工作的: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]
      猜你喜欢
      • 2019-12-30
      • 2018-08-03
      • 2023-04-02
      • 2023-04-05
      • 2019-01-16
      • 2018-06-10
      相关资源
      最近更新 更多