为何含Nan值的DataFrame调用df.dropna()无法删除缺失值行?
df.dropna()无法删除含缺失值行的原因及解决办法 为什么删不掉?
pandas的dropna()只识别标准缺失值:np.nan、pd.NA或Python原生的None。你示例行里的Nan是大写首字母的字符串"Nan",属于普通文本内容,pandas不会将其判定为缺失值,因此dropna()不会对这些行进行处理。
解决步骤
1. 先确认数据中的"假缺失值"
先验证这些Nan的实际类型和分布:
# 查看目标列的所有唯一值,确认是否存在字符串"Nan" print(df['目标列名'].unique()) # 统计整个DataFrame中"Nan"的出现次数 print(df.apply(lambda col: col == 'Nan').sum())
2. 将字符串"Nan"转换为标准缺失值
有两种高效处理方式:
方式一:读取CSV时直接指定缺失值标记
在读取数据阶段就把"Nan"转换成np.nan:
df = pd.read_csv('/Users/xxx/Desktop/CS 677/Homework_4/FashionDataset.csv', na_values=['Nan'])
na_values支持同时指定多种缺失值形式,比如na_values=['Nan', 'NA', 'null', ''],可一次性处理所有非标准缺失值。
方式二:读取后批量替换
如果已完成数据读取,直接全局替换:
import numpy as np # 将所有"Nan"字符串替换为标准缺失值np.nan df = df.replace('Nan', np.nan) # 执行缺失值行删除 df = df.dropna()
⚠️ 注意:dropna()默认返回新的DataFrame,若想直接修改原数据,需添加参数inplace=True:df.dropna(inplace=True)
3. 验证处理效果
确认缺失值已被正确识别并删除:
# 查看每列的缺失值剩余数量 print(df.isna().sum()) # 对比处理前后的行数变化 print(len(df))
额外实用技巧
- 若只需删除全为缺失值的行,使用
df.dropna(how='all') - 若只需删除指定列存在缺失值的行,使用
df.dropna(subset=['列名1', '列名2'])
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

