删除多级索引级别但保留列名称 - Pandas

11

我有一个看起来像这样的df

   a     b      c
              c1  c2
0  87    33   32  34
1  32    10   45  62
2  78    83   99  71

我想要删除c列但是保留其他所有的列名。

Translated:

我想要删除c列但是保留其他所有的列名。

   a     b    c1  c2
0  87    33   32  34
1  32    10   45  62
2  78    83   99  71

df.columns = df.columns.droplevel(0)可以起作用,但是ab的名称会消失。

              c1  c2
0  87    33   32  34
1  32    10   45  62
2  78    83   99  71

你怎么得到它?通过 pivot_table 吗? - jezrael
1个回答

8

如果 c 为真,您可以使用列表推导式选择第二级值:

df.columns = [col2 if col1 == 'c' else col1 for col1, col2 in df.columns]
print (df)
    a   b  c1  c2
0  87  33  32  34
1  32  10  45  62
2  78  83  99  71

旧版pandas的先前解决方案:

我认为您可以使用 set_index + droplevel + reset_index

df = df.set_index(['a','b'])
df.columns = df.columns.droplevel(0)
df = df.reset_index()
print (df)
    a   b  c1  c2
0  87  33  32  34
1  32  10  45  62
2  78  83  99  71

通过选择列 ['c'] 的另一个解决方案:

df = df.set_index(['a','b'])['c'].reset_index()
print (df)
    a   b  c1  c2
0  87  33  32  34
1  32  10  45  62
2  78  83  99  71

但是如果从pivot_tablesolution获取它,则需要删除[]或添加参数values='c'(如果缺少)。


你发布的第二个解决方案对我有用。你的第一个解决方案输出的格式与答案中显示的不同。感谢你的帮助! - BGG16
1
你能说一下是哪些版本吗?1.4?1.5?由于混合了变量名和列名,新的列表推导式有点难以理解。我会将其写成df.columns = [col2 if col1 == 'c' else col1 for col1, col2 in df.columns] - smci
1
@smci - 你能说明一下测试的是哪些版本吗? - 在pandas 1.5中尝试了最后两个解决方案并失败了,因此创建了通用解决方案。 - jezrael
@smci - df.columns = [col2 if col1 == 'c' else col1 for col1, col2 in df.columns] - 超级好的想法,我可以添加到答案中。 - jezrael
1
好的。你可能还想评论一下 for clev1, clev2 in df.columns,它是对 2 级列多级索引级别进行迭代。 - smci
显示剩余2条评论

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