Pandas DataFrame空值清理时数据错位问题的解决方法咨询
问题描述
我正在开展一个项目,需要从PDF表格提取数据并转换为pandas DataFrame。原始PDF表格内容如下:
C100 C200 C300 30 0 92 22 0 6 46 0 2
但转换后得到的DataFrame出现了C200列数据错位的问题,结果如下:
0 1 2 3 0 C100 C200 C300 1 30 0 92 2 22 0 6 3 46 0 2
我尝试先将空值转换为NaN再处理,但最终得到的替换值与原始表格不符:
执行代码:
df.replace(r'^\s*$', np.nan, regex=True)
得到结果:
0 1 2 3 0 C100 C200 NaN C300 1 30 NaN 0 92 2 22 NaN 0 6 3 46 NaN 0 2
再执行:
df.ffill(axis=1)
得到错误结果:
0 1 2 3 0 C100 C200 C200 C300 1 30 30 0 92 2 22 22 0 6 3 46 46 0 2
请问如何将这些NaN值替换为原始表格对应的正确值?
解决方案
方法1:手动重组数据列
观察错位结构可知,C200的实际值在第2列,表头C200在第1列。直接手动映射列并重组数据:
import pandas as pd import numpy as np # 假设错位后的DataFrame为df data = [ ["C100", "C200", np.nan, "C300"], [30, np.nan, 0, 92], [22, np.nan, 0, 6], [46, np.nan, 0, 2] ] df = pd.DataFrame(data) # 构建正确的数据集 corrected_data = { "C100": df.iloc[1:, 0].values, "C200": df.iloc[1:, 2].values, "C300": df.iloc[1:, 3].values } corrected_df = pd.DataFrame(corrected_data)
执行后得到符合预期的结果:
C100 C200 C300 0 30 0 92 1 22 0 6 2 46 0 2
方法2:调整填充逻辑并重置表头
先处理表头行的缺失值,再重新映射数据列:
# 处理表头行:用右侧值反向填充缺失的列名 df.iloc[0] = df.iloc[0].bfill(axis=1) # 设置正确的列名 df.columns = df.iloc[0] # 移除原表头行 df = df.drop(0).reset_index(drop=True) # 将C200列替换为错位的实际值列 df["C200"] = df.iloc[:, 2].values # 保留需要的列 corrected_df = df[["C100", "C200", "C300"]]
方法3:从根源避免错位(PDF提取阶段)
如果使用tabula-py或pdfplumber提取PDF表格,可直接指定列边界,避免错位:
- 用tabula示例:
from tabula import read_pdf # 根据PDF页面的实际列位置设置坐标,确保列对齐 df = read_pdf("your_pdf_file.pdf", columns=[50, 150, 250], pages=1)
- 用pdfplumber示例:
import pdfplumber with pdfplumber.open("your_pdf_file.pdf") as pdf: page = pdf.pages[0] # 手动设置表格的列边界 table = page.extract_table( settings={ "vertical_strategy": "explicit", "explicit_vertical_lines": [50, 150, 250, 350] } ) df = pd.DataFrame(table[1:], columns=table[0])
内容的提问来源于stack exchange,提问作者Ainulindalë
相关产品推荐
相关产品推荐

