提问人:HappyPy 提问时间:6/19/2017 更新时间:4/21/2023 访问量:13612
删除多索引级别,但保留列名 - Pandas
drop multiindex level but keep names of columns - pandas
问:
我有一个看起来像这样的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)
作品,但名称和消失a
b
c1 c2
0 87 33 32 34
1 32 10 45 62
2 78 83 99 71
答:
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
评论
pivot_table