如何将MultiIndex类型的DataFrame转换为单索引DataFrame?
问题根因
你代码里生成MultiIndex列的核心原因是赋值列名时多加了一层嵌套列表:columns_list = [df_duplicate.iloc[0].values] 这段代码把一维的列名序列套成了二维结构,pandas会自动将这种结构解析为多层列索引。另外你用的reset_index()方法是用来重置行索引的,对列索引没有任何修改作用,自然达不到预期效果。
修复方案
方案1:直接修改原逻辑,从根源避免生成MultiIndex
直接修改列名赋值逻辑,去掉外层嵌套列表即可,同时优化原有判断逻辑的兼容问题,修正后的完整代码如下:
import pandas as pd def read_file(file): """ 读取带ITD_前缀工作表的Excel,自动跳过表头前的无用行,返回单索引DataFrame """ excel = pd.ExcelFile(file) # 匹配带ITD_前缀的工作表 read_sheet = None sheet_prefix = 'ITD_' for sheet_name in excel.sheet_names: if sheet_prefix in sheet_name: read_sheet = sheet_name break # 匹配到第一个符合要求的表就停止,需要取最后一个的话去掉break即可 if not read_sheet: raise ValueError("未找到带ITD_前缀的工作表") df_duplicate = pd.read_excel(file, sheet_name=read_sheet) # 循环删除顶部无用行,直到第一列列名为ACCIDENT ID while df_duplicate.columns[0] != 'ACCIDENT ID': # 直接将第一行设为新列名,不要套外层列表,避免生成MultiIndex df_duplicate.columns = df_duplicate.iloc[0].values df_duplicate = df_duplicate.iloc[1:].reset_index(drop=True) # 后续清洗逻辑不变 df_duplicate = df_duplicate.dropna(how='all', axis='columns') df_duplicate = df_duplicate.reset_index(drop=True) return df_duplicate
方案2:已有MultiIndex列的DataFrame转单索引
如果你不想修改原有读取逻辑,也可以在返回结果前加一行代码提取第一层列名作为单索引:
# 提取MultiIndex的第一层作为列名,0对应第一层,有需要可以换成其他层级的序号 df_duplicate.columns = df_duplicate.columns.get_level_values(0)
将这行代码加在return df_duplicate之前即可。
内容的提问来源于stack exchange,提问作者Nhyi
相关产品推荐
相关产品推荐

