使用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
相关产品推荐
相关产品推荐

