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

drop multiindex level but keep names of columns - pandas

提问人:HappyPy 提问时间:6/19/2017 更新时间:4/21/2023 访问量:13612

问:

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

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

我想删除该级别,但保留所有其他列名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
Python Pandas 多索引

评论

0赞 jezrael 6/19/2017
你怎么得到它?由?pivot_table

答:

8赞 jezrael 6/19/2017 #1

如果满足以下条件,则可以使用列表推导式来选择二级值: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_table[]values='c'

评论

0赞 BGG16 1/25/2023
您发布的第二个解决方案对我有用。对我来说,您的第一个解决方案的输出格式与答案中显示的输出不同。谢谢你的帮助!
0赞 smci 4/21/2023
@jezrael:这适用于哪些版本的 Pandas?你能确认它仍然适用于 1.4、1.5、2.0 吗?
1赞 smci 4/21/2023
你能说说是哪个版本吗?1.4?1.5?新的列表理解有点难以理解,因为它混合了恰好是列名的变量名。我会把它写成df.columns = [col2 if col1 == 'c' else col1 for col1, col2 in df.columns]
1赞 jezrael 4/21/2023
@smci - - 在 pandas 1.5 中测试了最后 2 个解决方案,但失败了,因此请创建通用解决方案。Can you state which versions
1赞 smci 4/22/2023
整洁。您可能还想注释这是对 2 级列多索引级别的迭代。for clev1, clev2 in df.columns