批量导入Excel文件合并为DataFrame时遇异常问题求助
问题分析与解决方案
核心问题定位
- 表头读取错误:代码里用
header=1指定从第2行(索引1)作为表头,但你明确要保留原文件表头。如果原文件表头在第1行(索引0),这会导致:- 把真实数据行当作表头,每个文件的列名变得混乱且不统一
pd.concat会保留所有不重复的列名,最终造成列数暴增(出现922列)
- 文件匹配验证缺失:没确认
my_files是否准确抓取了所有目标文件,可能存在漏抓或误抓无关Excel文件的情况
修正后的代码
import glob import pandas as pd import os path = r"C:\Users\..." # 精准匹配目标文件名格式:filename_yyyy_mm_dd.xlsx my_files = glob.glob(os.path.join(path, "filename_*.xlsx")) # 先验证抓取的文件数量是否符合预期(约400个) print(f"共抓取到 {len(my_files)} 个文件") file_li = [] for filename in my_files: # 使用原文件第1行(索引0)作为表头读取 df = pd.read_excel(filename, index_col=None, header=0) # 可选:过滤列数异常的文件,避免污染合并结果 if df.shape[1] != 14: print(f"警告:文件 {os.path.basename(filename)} 列数异常,当前为 {df.shape[1]} 列") continue file_li.append(df) # 按行合并所有数据 frame = pd.concat(file_li, axis=0, ignore_index=True) # 验证合并结果 print(f"合并后数据行数:{frame.shape[0]},列数:{frame.shape[1]}") frame.info()
额外优化建议
- 内存优化读取:用生成器表达式替代列表存储,减少内存占用:
frame = pd.concat( (pd.read_excel(f, header=0) for f in my_files if pd.read_excel(f, header=0).shape[1]==14), axis=0, ignore_index=True ) - 异常文件排查:如果仍有列数问题,单独打开报错文件,检查是否存在合并单元格、空列、表头行错位等格式问题
- 进度跟踪:添加进度条(需先安装
tqdm包),方便查看处理进度:from tqdm import tqdm for filename in tqdm(my_files): # 读取逻辑同上
内容的提问来源于stack exchange,提问作者Chetan Patel
相关产品推荐
相关产品推荐

