如何用Pandas读取含多行表头的XLS文件?遇ParserError报错
解决Pandas读取复合表头Excel文件的ParserError问题
首先得说,你用pd.read_csv()读取XLS格式的文件本身就踩坑啦!csv和xls是完全不同的文件格式,Pandas的read_csv专门处理逗号分隔的文本文件,而XLS是Excel的二进制格式,得用pd.read_excel()才对,这很可能是触发报错的核心原因之一。
接下来针对你的复合表头(第3行是一级表头,第4行是二级表头),给你几个可行的方案:
方案1:正确使用read_excel读取复合表头
直接用read_excel,注意Pandas的行索引是从0开始的——你说的第3行对应索引2,第4行对应索引3,所以指定header=[2,3]就行;如果需要跳过前面的行或者中间的行(比如你提到的第7行,对应索引6),加上skiprows参数:
import pandas as pd # 重点:用read_excel而非read_csv df = pd.read_excel("你的文件路径或URL", skiprows=[0,1,6], header=[2,3])
这样加载后,第3、4行会组成多级表头,比如('DATE', '')或者('BENCHMARK NAME', '1ST (PERCENT)')这类格式的列名,后续你可以用df.columns查看,或者按需重命名。
方案2:兼容文件中的不规则行(如果仍报错)
要是还是碰到Error tokenizing data,大概率是文件里有列数和表头不匹配的行(比如空行、合并单元格导致的格式混乱),可以试试这些参数兼容:
- 添加
on_bad_lines='skip':跳过列数异常的行(Pandas 1.4.0及以上版本支持) - 指定
usecols:明确要读取的列,避开空列干扰 - 选对引擎:XLSX文件用
engine='openpyxl',旧版XLS文件用engine='xlrd'(注意xlrd 2.0+不再支持XLSX)
示例代码:
df = pd.read_excel( "你的文件路径或URL", skiprows=[0,1,6], header=[2,3], on_bad_lines='skip', engine='openpyxl' # XLSX用这个,XLS换xlrd )
方案3:手动加载表头并整理数据
如果上面的方法都不好使,还可以手动控制表头生成,灵活性更高:
# 先跳过前6行,读取所有内容(包含第3、4行的表头) temp_df = pd.read_excel("你的文件路径或URL", skiprows=6) # 提取前两行作为多级表头 multi_header = pd.MultiIndex.from_arrays([temp_df.iloc[0], temp_df.iloc[1]]) # 从第3行开始作为有效数据 df = temp_df.iloc[2:].copy() # 给数据设置多级表头 df.columns = multi_header # 重置索引 df = df.reset_index(drop=True)
最后提个醒:一定要确认你的文件是XLS还是XLSX,对应的引擎参数要选对,不然也会出现莫名其妙的报错哦!
内容的提问来源于stack exchange,提问作者pyCthon
相关产品推荐
相关产品推荐

