我有一个数据框,非常类似于此问题中的数据框: 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
你能帮我实现这个目标吗?
答案 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