从Pandas DataFrame提取的列表中检查np.nan存在性的异常行为排查
问题原因解析
核心背景:np.nan的特殊性质
np.nan遵循IEEE浮点数标准,它不等于任何值,包括自身(执行np.nan == np.nan会返回False)。但Python的对象身份判断(is)是检查内存地址,同一个np.nan实例的is判断会返回True。
直接列表中nan in 列表返回True的原因
你创建basic_list时,列表里的nan和用来检查的nan是同一个numpy.float64实例。Python列表的in操作在判断元素是否存在时,会优先检查对象身份:如果是同一个实例,即使==比较返回False,也会判定元素存在,因此返回True。
Pandas提取列表后nan in 列表返回False的原因
当你把列表存入Pandas DataFrame,再通过to_list()提取时,Pandas会重新生成nan对象。此时pandas_list中的nan和原列表的nan不是同一个实例(执行basic_list[1] is pandas_list[1]会返回False),同时np.nan == pandas_list[1]也返回False,双重判断都不满足,因此nan in pandas_list返回False。
列表相等性判断为False的原因
列表的==比较是逐个元素用==判断,而nan元素的==比较始终返回False,因此整个列表的相等性判断结果为False。
验证代码
from numpy import nan import pandas as pd basic_list = [0.0, nan, 1.0, 2.0] df = pd.DataFrame({'test_list': basic_list}) pandas_list = df['test_list'].to_list() # 检查两个nan是否为同一实例 print(basic_list[1] is pandas_list[1]) # 输出: False # 检查两个nan的相等性 print(basic_list[1] == pandas_list[1]) # 输出: False
内容的提问来源于stack exchange,提问作者frenchytheasian
相关产品推荐
相关产品推荐

