求助:将PDF中不规则主从行表格转换为Pandas DataFrame
解决方案
针对你提到的PDF表格转DataFrame后的格式转换需求,我们可以通过Pandas的字符串匹配、填充和合并操作实现,具体步骤如下:
1. 预处理读取后的原始数据
假设你用tabula读取后的DataFrame命名为df,先统一处理空单元格:
import pandas as pd # 替换空字符串为Pandas标准空值 df = df.replace("", pd.NA)
2. 标记主行与子行
根据子行的唯一关键词(示例中为"Child"),新增列区分主/子行,并标记主行名称:
# 标记子行(可根据实际关键词修改匹配规则) df["is_child"] = df["Name"].str.contains("Child", na=False) # 提取主行的Name值,用于后续关联子行 df["Master"] = df.loc[~df["is_child"], "Name"]
3. 关联子行与对应主行
将主行名称向下填充,让每个子行都匹配到对应的主行:
df["Master"] = df["Master"].ffill()
4. 子行继承主行空值列
用矢量化操作高效实现:子行空值取对应主行的列值,非空则保留自身数据:
# 拆分主行与子行数据 master_df = df[~df["is_child"]].rename(columns={"Name": "Master"}).set_index("Master") child_df = df[df["is_child"]].set_index("Master") # 合并填充:子行空值用主行对应值覆盖 child_df = child_df.combine_first(master_df).reset_index()
5. 整理成目标格式
筛选子行数据,调整列顺序,清理临时列:
# 按目标表格的列顺序整理 target_cols = ["Master", "Name", "Code A", "Code B", "More Columns"] final_df = child_df[target_cols].reset_index(drop=True)
验证结果
打印最终DataFrame确认格式:
print(final_df)
运行后会自动过滤无对应子行的主行(如示例中的Master 0),完全匹配你给出的目标表格结构。
注意事项
- 若子行关键词不是"Child",修改
str.contains中的匹配字符串即可; - 若PDF读取后存在重复表头,可通过
df = df[~df["Name"].str.contains("Name", na=False)]提前过滤; - 新增列无需修改代码,矢量化操作会自动处理所有列的空值继承逻辑。
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

