Pandas concat合并Tabula提取的PDF表格出现阶梯偏移如何解决
Tabula多页PDF表格拼接偏移修复方案
问题根因
tabula默认对PDF每页单独做表头识别,连续跨页的表格只有第一页会识别到真实业务列名,后续页面的首行(实际是数据行)会被误识别为表头,自动生成1、2、3、4格式的数字列名。调用concat合并时pandas会按列名对齐,列名不匹配就会出现空值占位、后续页数据右移的阶梯状效果。
修复步骤
- 第一步:调用
read_pdf时关闭自动表头识别,强制所有页内容都识别为数据行
代码示例:import tabula import pandas as pd # 提取所有页表格,pandas_options参数关闭自动表头识别 df_list = tabula.read_pdf("目标PDF路径.pdf", pages="all", pandas_options={'header': None}) - 第二步:统一所有表格的列名,移除第一页重复的表头行
代码示例:# 取第一页第一行作为全局统一列名 global_cols = df_list[0].iloc[0].tolist() # 给所有表格设置相同列名 for df in df_list: df.columns = global_cols # 移除第一页的表头行(已作为列名使用,无需保留在数据中) df_list[0] = df_list[0].drop(index=0).reset_index(drop=True) - 第三步:纵向拼接所有表格后导出
代码示例:merge_df = pd.concat(df_list, ignore_index=True) merge_df.to_excel("输出文件路径.xlsx", index=False)
特殊场景适配
如果你的PDF每一页都重复打印了表头(即每页第一行都是相同列名),可在遍历设置列名时增加表头行过滤逻辑:
for i in range(len(df_list)): # 若当前页首行和全局列名完全一致,判定为重复表头,直接删除 if df_list[i].iloc[0].tolist() == global_cols: df_list[i] = df_list[i].drop(index=0).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Arseniy
相关产品推荐
相关产品推荐

