PDF提取表格后Pandas空值填充代码无反应问题排查
问题翻译
我从PDF中提取了一个表格,存在格式问题:该表格有两列,部分行的A列值与下一行的B列值错位,示例DataFrame如下:
import pandas as pd import numpy as np df = pd.DataFrame() df['names'] = ['John','Mary',np.nan,'George'] df['numbers'] = ['1',np.nan,'2','3']
我希望将numbers列的空值填充为下一行的对应值,之后用.dropna()清理无效行。尝试了以下代码:
for i in range(len(df)): if df['numbers'][i] == np.nan: df['numbers'][i] = df['numbers'][i+1]
但DataFrame无变化且无报错,请问问题出在哪里?
问题根源
你用== np.nan判断空值的方式完全错误——np.nan和任何值(包括它自己)比较结果都是False,这是浮点数NaN的固有特性。所以你的循环里的判断条件永远不成立,自然不会执行赋值操作,DataFrame也就没变化。
正确解决方法
方法1:修正循环判断逻辑
把== np.nan换成pd.isna()或np.isnan()检测空值,同时注意循环边界避免索引越界:
import pandas as pd import numpy as np df = pd.DataFrame() df['names'] = ['John','Mary',np.nan,'George'] df['numbers'] = ['1',np.nan,'2','3'] for i in range(len(df)-1): # 最后一行无需处理,防止i+1超出索引范围 if pd.isna(df['numbers'][i]): df['numbers'][i] = df['numbers'][i+1] df = df.dropna()
方法2:用Pandas内置方法更高效
Pandas提供了bfill()(向后填充)方法,直接用下一行值填充当前空值,比循环简洁高效:
import pandas as pd import numpy as np df = pd.DataFrame() df['names'] = ['John','Mary',np.nan,'George'] df['numbers'] = ['1',np.nan,'2','3'] # 先对numbers列向后填充空值,再删除无效行 df['numbers'] = df['numbers'].bfill() df = df.dropna()
执行后得到的结果:
| names | numbers | |
|---|---|---|
| 0 | John | 1 |
| 1 | Mary | 2 |
| 3 | George | 3 |
内容的提问来源于stack exchange,提问作者Marcelo Soares
相关产品推荐
相关产品推荐

