You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python JupyterLab中打开PDF文件并清洗转换数据?

从PDF提取数据并转换为清洗后的Excel(Python实现)

一、PDF数据提取(解决JupyterLab无法直接解析PDF的问题)

JupyterLab本身不具备PDF内容解析能力,需要借助Python第三方库提取文本或表格数据,常用工具包括PyPDF2(纯文本提取)、tabula-py(结构化表格提取)、pdfplumber(高精度文本/表格提取)。

1. 先安装依赖库

pip install PyPDF2 tabula-py pdfplumber pandas openpyxl

2. 代码示例

场景1:PDF以结构化表格为主(用tabula-py)

import tabula
import pandas as pd

# 提取PDF所有页面的表格,返回DataFrame列表
dfs = tabula.read_pdf("your_file.pdf", pages="all", multiple_tables=True)

# 合并所有表格(按需选择)
combined_df = pd.concat(dfs, ignore_index=True)

# 导出为原始数据Excel,方便后续清洗
combined_df.to_excel("raw_data.xlsx", index=False)

场景2:PDF以非结构化文本为主(用pdfplumber)

import pdfplumber
import pandas as pd

text_lines = []
with pdfplumber.open("your_file.pdf") as pdf:
    for page in pdf.pages:
        # 提取单页文本并按行拆分
        lines = page.extract_text().split("\n")
        text_lines.extend(lines)

# 将文本转为DataFrame(需根据实际文本分隔符调整,示例用制表符)
df = pd.DataFrame([line.split("\t") for line in text_lines])
df.to_excel("raw_text_data.xlsx", index=False)

二、Python数据清洗核心技巧

针对杂乱数据集,按以下步骤处理:

  • 缺失值处理

    • 删除关键列缺失的行:df.dropna(subset=["核心标识列"], inplace=True)
    • 数值列用中位数填充:df["数值列"].fillna(df["数值列"].median(), inplace=True)
    • 分类列用众数填充:df["分类列"].fillna(df["分类列"].mode()[0], inplace=True)
  • 重复值处理

    • 查找重复行:df.duplicated(subset=["唯一标识列"])
    • 删除重复行(保留第一行):df.drop_duplicates(subset=["唯一标识列"], keep="first", inplace=True)
  • 数据类型修正

    • 转换日期格式:df["日期列"] = pd.to_datetime(df["日期列"], errors="coerce")(无法转换的设为NaT)
    • 转换数值类型:df["数值列"] = pd.to_numeric(df["数值列"], errors="coerce")
  • 异常值处理

    • 四分位数法过滤异常值:
      Q1 = df["数值列"].quantile(0.25)
      Q3 = df["数值列"].quantile(0.75)
      IQR = Q3 - Q1
      df = df[(df["数值列"] >= Q1-1.5*IQR) & (df["数值列"] <= Q3+1.5*IQR)]
      
  • 格式统一

    • 字符串去首尾空格:df["文本列"] = df["文本列"].str.strip()
    • 统一为小写:df["文本列"] = df["文本列"].str.lower()
    • 移除特殊字符:df["文本列"] = df["文本列"].str.replace("[^a-zA-Z0-9\u4e00-\u9fa5]", "", regex=True)
  • 列名规范化

    • 重命名列:df.rename(columns={"旧列名1": "新列名1", "旧列名2": "新列名2"}, inplace=True)
    • 批量整理列名:df.columns = [col.strip().lower().replace(" ", "_") for col in df.columns]

三、完整流程示例(提取+清洗+保存)

import tabula
import pandas as pd

# 1. 提取PDF表格
dfs = tabula.read_pdf("data.pdf", pages="all", multiple_tables=True)
df = pd.concat(dfs, ignore_index=True)

# 2. 数据清洗
# 规范化列名
df.columns = [col.strip().lower().replace(" ", "_") for col in df.columns]
# 删除重复行
df.drop_duplicates(subset=["user_id"], keep="first", inplace=True)
# 填充缺失值
df["age"].fillna(df["age"].median(), inplace=True)
df["gender"].fillna("未知", inplace=True)
# 修正日期格式
df["register_date"] = pd.to_datetime(df["register_date"], errors="coerce")
# 过滤收入异常值
Q1 = df["monthly_income"].quantile(0.25)
Q3 = df["monthly_income"].quantile(0.75)
IQR = Q3 - Q1
df = df[(df["monthly_income"] >= Q1-1.5*IQR) & (df["monthly_income"] <= Q3+1.5*IQR)]

# 3. 保存为清洗后的Excel
df.to_excel("cleaned_data.xlsx", index=False)

内容的提问来源于stack exchange,提问作者Jenna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:35:26