如何合并tabula-py提取PDF表格所得pandas DataFrame中Tag非NaN的多行数据
实现方案
核心处理逻辑分为三步:
- 把tabula提取到的多页表格合并为单个DataFrame
- 生成分组标识:以Tag列为非空的行作为分组起点,后续属于同一条目的拆分行分配相同的分组ID
- 按分组ID聚合,每列的内容用
\n拼接,自动过滤空值(NaN)
完整可运行代码
import pandas as pd import numpy as np import tabula # 你原有逻辑 filename='tags.pdf' tagTableStart=2 #784 tagTableEnd=39 #822 tableHeadings = ['Tag','Item','Length','Description','Value'] pageRange = "%d-%d" % (tagTableStart, tagTableEnd) print ("Scanning pages %s" % pageRange) tables = tabula.read_pdf(filename, pages=pageRange) # 新增合并处理逻辑 # 合并多页提取的表格为单个DataFrame df = pd.concat(tables, ignore_index=True) # 统一列名 df.columns = tableHeadings # 生成分组ID:每遇到非空Tag,分组ID+1,同一条目的拆分行会归属同一个分组 df['group_id'] = df['Tag'].notna().cumsum() # 定义单列合并规则:过滤空值后转字符串,用换行符拼接 def merge_col(col): return '\n'.join(col.dropna().astype(str)) # 按分组聚合得到最终结果 result = df.groupby('group_id').agg( Tag=('Tag', merge_col), Item=('Item', merge_col), Length=('Length', merge_col), Description=('Description', merge_col), Value=('Value', merge_col) ).reset_index(drop=True) # 输出验证结果 print(result)
可选优化
如果需要去掉内容里的多余空格、空行,可以把merge_col函数修改为如下实现,自动清理无效空白:
def merge_col(col): valid_str = [x.strip() for x in col.dropna().astype(str) if x.strip()] return '\n'.join(valid_str)
内容的提问来源于stack exchange,提问作者JoSSte
相关产品推荐
相关产品推荐

