如何删除Pandas DataFrame指定列中含NaN值的行?
问题根因
- 集合输出出现重复
nan是正常特性,不是异常:pandas 中默认的缺失值为 NumPy 实现的np.nan,该值的等值判断逻辑为np.nan != np.nan,而Python的set是通过对象等值性判断元素是否重复,因此每个nan都会被识别为独立元素,无法被set自动去重。 - 列赋值后缺失值没被删掉是索引对齐机制导致的:
df['col1'].dropna()返回的是剔除缺失值后的Series,保留的是非空行的原始索引,将这个Series赋值回原DataFrame的col1列时,pandas会按照索引逐行匹配,原缺失值所在的行因为在drop后的结果里没有对应索引的取值,会被自动填充为nan,相当于操作无效。
正确操作方法
根据实际需求选对应方案即可:
- 需要删除
col1列存在缺失值的整行数据(最常用场景):
调用dropna时指定subset参数,明确要判断缺失值的列,不要单独对列做dropna再赋值:# 方案1:dropna指定子集 df = df.dropna(subset=['col1']) # 方案2:布尔索引过滤,效果完全一致 df = df[df['col1'].notna()] - 仅需要获取
col1列无缺失值的序列,不改动原DataFrame的结构:
不要将dropna的结果赋值回原df的列,直接用变量接收返回值即可:col1_without_null = df['col1'].dropna()
补充提示
如果需要查看列的真实唯一值,不要用原生set(),使用pandas内置的接口即可正确识别nan、完成去重:
# 查看col1的所有唯一值,nan只会出现一次 print(df['col1'].unique()) # 统计col1每个取值的出现次数,包含nan的计数 print(df['col1'].value_counts(dropna=False))
内容的提问来源于stack exchange,提问作者Ze0ruso
相关产品推荐
相关产品推荐

