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

pandas无法删除指定列含NaN值的行,求问题原因及解决方法

问题原因及对应解决方法

原因1:列中显示的“NaN”不是pandas可识别的原生缺失值,是字符串类型的占位符

绝大多数情况下该问题都是这个原因导致的:你看到的NaN实际是字符串'NaN'、'nan'、'N/A'或者空字符串'',pandas的dropna、notna只能识别原生的np.nan、pd.NA、None类缺失值,无法识别字符串形式的空占位符。

  • 验证代码:
# 查看Class列所有值的类型
print(dataset['Class'].apply(type).unique())

如果输出结果中包含<class 'str'>,即可确认是该问题。

  • 修复代码:
# 先把所有字符串形式的空占位符替换为pandas可识别的缺失值
dataset['Class'] = dataset['Class'].replace(['NaN', 'nan', 'N/A', '', ' '], pd.NA)
# 再执行删除操作
dataset = dataset.dropna(subset=['Class'])

原因2:Class列为分类(Categorical)数据类型,空值是预设的分类项

如果你的Class列是分类类型,NaN可能是手动添加的分类值,不是真正的缺失值,dropna无法识别。

  • 验证代码:
# 查看列类型和所有分类项
print(dataset['Class'].dtype)
print(dataset['Class'].cat.categories)

如果输出dtype为category,且分类项中包含'NaN'/'nan',即可确认是该问题。

  • 修复代码:
# 移除分类中的空值项,自动转为原生缺失值
dataset['Class'] = dataset['Class'].cat.remove_categories(['NaN', 'nan'])
# 再执行删除操作
dataset = dataset.dropna(subset=['Class'])

原因3:操作后生成的是DataFrame视图,赋值未实际生效

如果操作前你通过切片/筛选生成过dataset的子视图,修改时会触发隐式拷贝,赋值没有真正作用到原变量上。

  • 修复代码:
    执行筛选后显式调用copy()生成新对象:
dataset = dataset[dataset['Class'].notna()].copy()

内容的提问来源于stack exchange,提问作者MCore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:30:04