如何避免过多Pandas DataFrame转数组操作?优化数据对比逻辑
优化方案:直接操作DataFrame对比PDF与JSON数据元素
核心思路
放弃转数组的复杂逻辑,全程用Pandas原生方法完成数据加载、对比、筛选,代码更简洁高效。以下是完整优化流程:
1. 解析PDF附录到DataFrame
用pdfplumber提取PDF中的表格数据(纯文本场景可先提取文本再结构化),直接生成DataFrame:
import pdfplumber import pandas as pd import json # 解析PDF表格到DataFrame with pdfplumber.open("appendix.pdf") as pdf: # 目标表格页码根据实际调整,示例为第3页(索引从0开始) page = pdf.pages[2] pdf_table = page.extract_table() # 转换为DataFrame并指定列名(匹配PDF附录表头) pdf_df = pd.DataFrame(pdf_table[1:], columns=pdf_table[0]) # 统一对比列的格式(去空格、转字符串,避免格式差异) pdf_df["element_code"] = pdf_df["element_code"].astype(str).str.strip()
2. 加载JSON数据并结构化
将JSON文件直接转为DataFrame,同步统一对比列格式:
# 加载JSON数据 with open("reference.json", "r", encoding="utf-8") as f: json_data = json.load(f) # 转换为DataFrame(假设JSON是元素列表,含element_code字段) json_df = pd.DataFrame(json_data) json_df["element_code"] = json_df["element_code"].astype(str).str.strip()
3. 对比找出缺失元素
用Pandas的isin()方法直接筛选,无需手动转数组遍历:
# 筛选PDF中有但JSON缺失的元素 missing_in_json = pdf_df[~pdf_df["element_code"].isin(json_df["element_code"])] # 筛选JSON中有但PDF缺失的元素(按需选择) missing_in_pdf = json_df[~json_df["element_code"].isin(pdf_df["element_code"])] # 合并结果并标记缺失位置(按需调整) result_df = pd.concat( [missing_in_json, missing_in_pdf], keys=["missing_in_json", "missing_in_pdf"] ).reset_index(level=0).rename(columns={"level_0": "missing_location"})
4. 导出为新JSON文件
直接用Pandas内置方法导出,无需手动拼接JSON结构:
# 导出为格式化的JSON文件,orient参数控制输出格式 result_df.to_json( "missing_elements.json", orient="records", force_ascii=False, indent=2 )
关键优化点
- 全程基于DataFrame操作,避免数组转译和循环对比,代码更简洁易维护
- 用
isin()替代手动遍历,时间复杂度更低,大数据量下效率提升明显 - 统一对比列的格式,规避因空格、数据类型差异导致的对比错误
- 复用Pandas内置的拼接、导出方法,减少重复造轮子
内容的提问来源于stack exchange,提问作者JoSSte
相关产品推荐
相关产品推荐

