You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:24:04