Pandas处理PDF读取的DataFrame时,.replace()与.strip()返回NaN问题
问题分析:Tabula读取PDF后处理卡号列出现大量NaN的原因
问题场景与代码
用Tabula读取PDF生成DataFrame并合并后,清理card_number列的问号时出现异常:原本正常的卡号也变成NaN,15309行里仅2400行非NaN,但实际只有约50行含非数字字符。使用的代码如下:
import pandas as pd import tabula df = tabula.read_pdf('card_details.pdf', pages='all') df = pd.concat(df, ignore_index=True)
尝试过.str.strip('?')和.str.replace(r'\D+', '')两种清理方式,结果一致。
核心原因
- 数据类型不匹配:Tabula读取PDF时,可能把
card_number列识别成了数值类型(比如float),而非字符串。.str系列方法只对字符串生效,非字符串类型的元素直接被转为NaN,导致大量正常数据“消失”。 - PDF读取时的结构识别误差:如果PDF里的表格存在跨行、格式混乱、隐藏空白字符的情况,Tabula读取时会把部分行的
card_number列识别为缺失值,后续字符串处理直接保留NaN,看起来像是正常数据丢失。 - 混合类型污染:列里同时存在数值、字符串、空值等多种类型,
.str方法只处理字符串元素,其他类型全部返回NaN,放大了缺失值的数量。
解决办法
- 先转字符串再清理:强制把
card_number列转为字符串类型,再处理非数字字符,最后清理转类型时产生的"nan"文本:
# 转为字符串类型 df['card_number'] = df['card_number'].astype(str) # 去除所有非数字字符 df['card_number'] = df['card_number'].str.replace(r'\D+', '', regex=True) # 把转类型产生的"nan"文本转为真正的缺失值 df['card_number'] = df['card_number'].replace('nan', pd.NA)
- 调整Tabula读取参数:针对PDF的类型调整读取参数,比如用
stream=True处理流式PDF,guess=False强制按指定边界读取,减少结构识别错误:
df_list = tabula.read_pdf('card_details.pdf', pages='all', stream=True, guess=False) df = pd.concat(df_list, ignore_index=True)
- 先验证原始数据:查看合并后DataFrame的列类型和缺失情况,确认是不是读取阶段就丢了数据:
# 查看列数据类型 print(df['card_number'].dtype) # 查看缺失值数量 print(df['card_number'].isna().sum())
内容的提问来源于stack exchange,提问作者Adam Idris
相关产品推荐
相关产品推荐

