如何在熊猫的嵌套列下放置所有列

时间:2019-01-28 00:43:34

标签: python pandas

我有一个数据框,非常类似于此问题中的数据框: 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

你能帮我实现这个目标吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用以下内容,假设您所谓的“下方的列”是第一个。

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

这是根据预期结果得出的快速答案,如果看起来很愚蠢,则抱歉,但是您可能会更精确地回答问题。

答案 2 :(得分:1)

不确定为什么需要这样做,但是可以使用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

答案 3 :(得分:0)

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

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

输出:

   c
0  2
1  4