如何将PDF中跨行地址合并为单行并转换为Pandas DataFrame?
解决PDF转Pandas DataFrame后Address列拆分的问题
当用tabula读取PDF表格时,Address列内容常被拆分为后续的NaN行,可通过以下步骤合并到对应主行:
方法一:数据后处理合并(通用方案)
如果读取后已经出现拆分,直接对DataFrame做聚合处理:
- 导入依赖并读取数据
import pandas as pd import tabula # 读取PDF表格 df = tabula.read_pdf(filename, pages=pages)[0]
- 标记分组并聚合
利用Pos列的非空值作为分组标识,将同一条记录的拆分行归为一组,再合并Address内容:
# 用Pos列的非空值填充分组ID,确保拆分行属于同一主记录 df['group_id'] = df['Pos'].ffill() # 按分组聚合:Address拼接所有非空片段,其他列取主行的非空值 cleaned_df = df.groupby('group_id').agg( Pos=('Pos', 'first'), Name=('Name', 'first'), Surname=('Surname', 'first'), DateOfBirth=('DateOfBirth', 'first'), Address=('Address', lambda x: ' '.join(x.dropna().str.strip())) ).reset_index(drop=True)
- 清理Address格式(可选)
如果Address片段中有多余的连字符或空格,可进一步处理:
# 移除换行导致的连字符后多余空格 cleaned_df['Address'] = cleaned_df['Address'].str.replace('-\s+', '-', regex=True)
方法二:调整tabula读取参数(从源头避免拆分)
尝试调整tabula的读取模式,让PDF表格识别更准确,减少拆分:
# 尝试lattice模式(适合带网格线的表格) df = tabula.read_pdf(filename, pages=pages, lattice=True)[0] # 或尝试stream模式(适合没有网格线的表格) df = tabula.read_pdf(filename, pages=pages, stream=True)[0]
内容的提问来源于stack exchange,提问作者NicWorkAccount
相关产品推荐
相关产品推荐

