如何将所有列放在最高级别的层次结构索引下

时间:2019-06-24 21:12:12

标签: python pandas

在数据框上使用“ groupby”功能后,我有了一个具有多级列层次结构的新数据框。顶层(例如index = 0)列之一被称为“总计”,其下有可变数量的第二层列(index = 1)。我已经找到了使用指定每个列名称的索引一次删除一个或多个第二级列的解决方案,但是根据我的数据源,我的脚本将在顶层下生成大量和可变数量的列。我只想指向名为“总计”的顶层列,并删除层次结构中属于它的所有列,而不必知道第二层列的潜在名称。

我已经尝试过删除单个列,但是找不到任何允许我删除所有列的在线内容。大多数示例都指定您必须指向要删除的列的索引,但是我的代码可以根据数据源生成许多第二级列(例如,可能不预先知道第二列的数目和名称)。 / p>

删除第二级(index = 1)列的示例:

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

我找不到摆脱第二列为一组的代码示例。

我的数据框看起来像这样,我想将所有列都放在“总计”下。该代码生成的列数可能很大,因此无法事先知道它们的名称和名称。它

                     Total  Total   perCent        perCent
Antibiotic         AMPICI   BENZYL    AMPICI    BENZYL
Organism                
Enterococcus avium  1   1   0.0 (0/1)   0.0 (0/1)
Enterococcus cassel 1   1   100.0 (1/1) 100.0 (1/1)
Enterococcus faecalis   46  45  95.7 (44/46)    95.6 (43/45)
Enterococcus faecalis   2   2   100.0 (2/2) 100.0 (2/2)

2 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您正在寻找DataFrame.droplevel()https://pandas-docs.github.io/pandas-docs-travis/reference/api/pandas.DataFrame.droplevel.html):

df.droplevel(level=1, axis=1)

但是,这将导致重复的列名,这可能是不希望的。相反,您可能想使用两个级别的值来展平MultiIndex列:

df.columns = ['_'.join(col) for col in df.columns.values]

答案 1 :(得分:0)

一种可能的方法是将MultiIndex转换为纯数据帧并标识要保留的列的数字位置。然后很容易删除不需要的列:

Parent

使用您的样本数据,它应该给出:

ix = pd.DataFrame(index=df.columns).reset_index()

result = df.iloc[:, ix[ix['level_0']!='Total'].index]