如何在 Pandas 中删除嵌套列下的所有列

3
我有一个数据框,与这个问题中的数据框类似: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

可以,请告诉我具体需要翻译的内容。

1
“所有在它下面的列”是指该标题下的第一列吗? - Andy Hayden
正如所指出的,'a' 是您数据框中两列的第一级标签。因此,'b''c' 都在 'a' 的下方。您能否澄清您的意图是什么? - busybear
4个回答

3

为了更清晰,我认为'b'和'c'都包含在'a'下。然而,在以下代码中,您可以选择要删除哪个。

首先构建数据框:

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

谢谢,你说得对。我的注意细节方面确实有所欠缺,但你知道我的意思。这个答案非常好用。 - MetaStack

1
假设您所说的“下面的列”是第一列,您可以使用以下内容。
z['a'].drop(z['a'].columns[0], axis=1)

这是一个基于预期结果的快速回答,如果它看起来很蠢,对不起,但也许你可以在你的问题中更加精确。

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

0

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

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

输出:

   c
0  2
1  4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接