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

使用pandas.read_excel重命名索引列及解决长度不匹配报错

解决pandas读取Excel时的长度不匹配报错问题

错误原因分析

你遇到的Length mismatch: Expected axis has 3 elements, new values have 4 elements报错,核心问题出在参数冲突:
当设置index_col=0时,指定的列会被从数据列中剥离作为索引,此时剩余的数据列只有3个,但你通过names传入了4个表头名称,pandas无法将4个名字分配给3个数据列,因此抛出长度不匹配的错误。

另外你的代码还存在一个逻辑矛盾:你想把第16行设为表头,但skiprows=16会直接跳过前16行(包括第16行本身),导致表头行被遗漏,后续读取的表头实际是第17行,这可能不符合你的需求。


解决方案1:先读取数据,再设置索引(最稳妥)

这种方式避开了读取时的参数冲突,步骤更清晰:

import pandas as pd

excel_file = 'Filename.xls'

# 读取文件:跳过前16行,跳过末尾38行,指定目标列,用自定义名称作为表头
df = pd.read_excel(
    excel_file,
    header=None,  # 不使用文件内的任何行作为表头,直接用自定义names
    skiprows=16,  # 跳过前16行无关内容
    skipfooter=38,  # 跳过末尾38行
    usecols=[1,2,3,4],  # 对应Excel中第2-5列(1-based),如果是0-based的2-5列则改为[2,3,4,5]
    names=['Name1', 'Name2', 'Name3', 'Name4']  # 自定义表头名称
)

# 将Name1列设置为索引
df.set_index('Name1', inplace=True)

# 查看结果
df

解决方案2:读取时直接设置索引(调整参数避免冲突)

如果想在读取阶段就完成索引设置,需要确保参数逻辑一致:

import pandas as pd

excel_file = 'Filename.xls'

df = pd.read_excel(
    excel_file,
    header=15,  # 指定原文件第16行(0-based索引为15)作为表头行
    skiprows=range(0,15),  # 跳过前15行无关内容,保留第16行作为表头
    skipfooter=38,
    usecols=[1,2,3,4],  # 对应Excel中第2-5列(1-based)
    names=['Name1', 'Name2', 'Name3', 'Name4'],  # 替换原表头的名称
    index_col=0  # 将读取后的第一列(Name1列)设为索引
)

df

额外注意事项

  • usecols的列索引是0-based的:如果你指的是Excel界面中显示的第2-5列(1-based),需要用[1,2,3,4];如果是代码中按0计数的第2-5列,则用[2,3,4,5]。
  • 如果不需要保留原文件的表头行,直接用header=None配合names参数是最不容易出错的方式。

内容的提问来源于stack exchange,提问作者DS_KZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:42:34