【问题标题】:how to drop all columns under a nested column in pandas如何删除熊猫嵌套列下的所有列
【发布时间】:2019-06-20 23:59:14
【问题描述】:

我有一个很像这个问题的数据框: Pandas: drop a level from a multi-level column index?

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 | 2
1 | 4

你能帮我实现吗?

【问题讨论】:

  • “它下面的所有列”是指该标题下的第一列?
  • 正如所指出的,'a' 是数据框中两列的第一级标签。所以'b''c' 都“低于”'a'。你能澄清一下你的意图是什么吗?

标签: python pandas


【解决方案1】:

你可以使用下面的假设你称之为“下面的列”,是第一个。

z['a'].drop(z['a'].columns[0], axis=1)

这是基于预期结果的快速回答,如果看起来很愚蠢,很抱歉,但也许您可以更准确地提出问题。

【讨论】:

    【解决方案2】:

    为了清楚起见,我认为“b”和“c”都包含在“a”下。但是,您可以在下面的代码中选择您希望删除的内容。

    首先构建DataFrame:

    cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
    df = pd.DataFrame([[1,2], [3,4]], columns=cols)
    

    然后删除列 ('a','b')...同时删除 'a' 级别,留下 'c'。

    df.drop([('a', 'b')], axis=1,inplace=True)
    df.columns = df.columns.droplevel()
    

    生成的 DataFrame 如下所示。

        c
    0   2
    1   4
    

    【讨论】:

    • 谢谢你,你说得对,我对细节的关注不够,但你知道我的意思。这个答案很好用
    【解决方案3】:

    不知道你为什么需要这个,但你可以使用 groupby 来实现这个

    df=df.groupby(level=0,axis=0).apply(lambda  x : x.iloc[:,1:])
    df.columns=df.columns.get_level_values(1)
    df
       c
    0  2
    1  4
    

    【讨论】:

      【解决方案4】:

      您可以从列中仅选择该切片,然后将列标题重命名为单级标题:

      df.loc(axis=1)[:,'c'].set_axis(['c'], axis=1, inplace=False)
      

      输出:

         c
      0  2
      1  4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-16
        • 2019-11-18
        • 1970-01-01
        • 2013-10-04
        • 2015-06-28
        • 2019-11-08
        • 2019-08-13
        • 1970-01-01
        相关资源
        最近更新 更多