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

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ë

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:25:21