如何删除DataFrame转置后的subcolumn_2列头层级?技术求助
解决MultiIndex列层级的移除问题
你遇到的核心问题是转置后的DataFrame列是多层索引(MultiIndex),subcolumn_2是列索引的第二个层级,而非普通的行或列,所以直接用drop()自然不管用。咱们一步步来搞定:
首先明确转置后的结构:你执行完代码后,my_frame.transpose()的列是包含subcolumn_1和subcolumn_2的双层索引。要移除subcolumn_2这个层级,有几种直观的方法:
方法1:直接删除列索引的指定层级
用droplevel()方法可以去掉列索引的第二个层级(索引从0开始计数,subcolumn_2是第1层):
import pandas as pd # 你的原始代码 my_frame = pd.DataFrame(data={'a':[1,1,3],'b':[7,8,9],'c':[4,5,6], 'subcolumn_1':['A1','A2','A3'], 'subcolumn_2':['B1','B2','B3']}) my_frame.set_index(keys=['subcolumn_1','subcolumn_2'], inplace=True) transposed_df = my_frame.transpose() # 移除subcolumn_2层级 transposed_df.columns = transposed_df.columns.droplevel(1) print(transposed_df)
执行后输出会变成:
A1 A2 A3 a 1 1 3 b 7 8 9 c 4 5 6
方法2:提取指定层级作为新列名
如果你明确只想保留subcolumn_1的内容作为唯一列名,也可以直接提取该层级的值:
transposed_df.columns = transposed_df.columns.get_level_values(0)
效果和方法1完全一致,适合你清晰知道要保留哪一层的场景。
方法3:转置前提前处理行索引(可选)
如果还没执行转置操作,也可以跳过subcolumn_2,只设置subcolumn_1为行索引,这样转置后就不会出现双层列索引的问题:
my_frame = pd.DataFrame(data={'a':[1,1,3],'b':[7,8,9],'c':[4,5,6], 'subcolumn_1':['A1','A2','A3'], 'subcolumn_2':['B1','B2','B3']}) # 仅设置subcolumn_1为行索引 my_frame.set_index(keys=['subcolumn_1'], inplace=True) transposed_df = my_frame.transpose()
为啥drop()没用?
因为drop()默认是删除独立的行或列(通过axis参数指定),但subcolumn_2是列索引的一个层级,不是单独的行/列,所以必须用MultiIndex专属的方法来处理层级结构。
内容的提问来源于stack exchange,提问作者Daniel Marchand
相关产品推荐
相关产品推荐

