You need to enable JavaScript to run this app. pandas用assign给列赋值np.nan后,==np.nan判断失效的原因及解决方法
优惠活动
大模型
产品
解决方案
定价
更多

pandas用assign给列赋值np.nan后,==np.nan判断失效的原因及解决方法

问题产生的核心原因

np.nan遵循IEEE 754浮点数标准设计,不存在和任何值相等的特性,包括它自身。也就是说,无论被比较的对象是不是真的np.nan,执行目标值 == np.nan的表达式永远返回False,代码自然无法进入对应的if分支,直接跳转else块执行。
可以快速验证这个规则:

import numpy as np
print(np.nan == np.nan) # 输出固定为 False
空值的正确判断方式

不要使用相等运算符判断NaN,根据开发场景选择专用的空值判定接口即可:

  • 对单个标量值做空值判断:可以使用np.isnan(待判断值),优先选择兼容性更强的pd.isna(待判断值),除了识别np.nan,还能兼容None、pd.NA等其他类型的空值
  • 对整列Series做批量空值判断:直接调用pandas内置的.isna()方法,批量运算效率更高,适配pandas全版本的空值定义
原代码的修正参考

将原来的相等判断替换为专用空值判断函数即可正常触发分支,同时原代码里的链式索引赋值写法(g["cluster"].iloc[j] = 值)属于pandas不推荐的写法,容易触发SettingWithCopyWarning、甚至赋值不生效的问题,建议替换为.loc位置索引写法。修正后的核心逻辑示例:

import pandas as pd
import numpy as np

for _, g in df.groupby(['x1','x2']):
    g = g.assign(cluster=np.nan)
    for j in range(g.shape[0]):
        # 替换原 == np.nan 的判断逻辑
        if pd.isna(g["cluster"].iloc[j]):
            print("in first if nan")
            cluster_name = str(cluster)+str(c)
            c = c + 1
            g.loc[j, "cluster"] = cluster_name
        else:
            print("not else")
            current_val = g["cluster"].iloc[j]
            print(current_val)
            print(type(current_val))
            cluster_name = current_val

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 06:15:02