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
相关产品推荐
相关产品推荐

