如何在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
相关产品推荐
相关产品推荐

