NaN 和 None 有啥区别?

Posted

技术标签:

【中文标题】NaN 和 None 有啥区别?【英文标题】:What is the difference between NaN and None?NaN 和 None 有什么区别? 【发布时间】:2013-07-06 05:25:48 【问题描述】:

我正在使用 pandas readcsv() 读取 csv 文件的两列,然后将值分配给字典。这些列包含数字和字母的字符串。偶尔会出现单元格为空的情况。在我看来,读取到该字典条目的值应该是None,而是分配了nan。当然None 更能描述空单元格,因为它有一个空值,而nan 只是说读取的值不是数字。

我的理解是否正确,Nonenan 有什么区别?为什么分配nan 而不是None

另外,我的字典检查是否有任何空单元格一直在使用numpy.isnan()

for k, v in my_dict.iteritems():
    if np.isnan(v):

但这给了我一个错误,说我不能将此检查用于v。我猜这是因为要使用整数或浮点变量,而不是字符串。如果这是真的,我如何检查v 是否有“空单元格”/nan 案例?

【问题讨论】:

文本qwerty 不是数字。 @RobertHarvey 我知道,所以None 肯定会更好地描述空单元格的值。 【参考方案1】:

函数isnan() 检查某事物是否为“非数字”,并返回变量是否为数字,例如isnan(2) 将返回false

条件myVar is not None返回变量是否定义

您的 numpy 数组使用 isnan(),因为它是一个数字数组,并且它将数组的所有元素初始化为 NaN 这些元素被认为是“空的”

【讨论】:

我认为 isnan(2) 会返回 False,因为 2 不是 NaN。 另外,numpy.empty 不会将数组值初始化为 NaN。它根本不初始化值。 None-ness 的正确检查是myVar is not None,而不是myVar != None 请注意,np.isnan() 没有为字符串变量实现,所以如果你传递一个字符串它会崩溃。最好使用与字符串一起使用的pd.isnull【参考方案2】:

NaN 可以用作数学运算的数值,而None 不能(或至少不应该)。

NaN 是一个数值,在IEEE 754 floating-point standard 中定义。 None 是一个内部 Python 类型 (NoneType),在这种情况下,它更像是“不存在”或“空”而不是“数值无效”。

其中的主要“症状”是,如果您对包含 NaN 的数组(甚至是单个数组)执行平均或求和,结果会得到 NaN...

另一方面,您不能使用None 作为操作数来执行数学运算。

因此,根据具体情况,您可以使用None 来告诉您的算法不要在计算中考虑无效或不存在的值。这意味着算法应该测试每个值以查看它是否为None

Numpy 有一些函数可以避免 NaN 值污染您的结果,例如 nansumnan_to_num

【讨论】:

我同意你的观点,None 应该用于不存在的条目,那么为什么df=pd.readcsv('file.csv') 给我NaN 空单元格的值而不是None?据我所知,pd.DataFrames 并不是数字专用的。 嗯,这可能是一种设计选择。我想DataFrames和Series有一个dtype,所以dtype=float的无效值必须用数值​​表示,NaN是,None不是(NoneNoneType)。 另外,很多 Pandas 方法都有一个 na 参数,可以让你决定用哪个值来替换不可用的值 好的,谢谢。所以我实际上并没有将数字读入我的 DataFrame,而是数字和字母的字符串。我应该使用哪种检查来检测空单元格?支票之类的;如果 dtype==float: ?? 或许发布一份 CSV 数据样本会有所帮助。我可以想象,如果有字符串,那么 dtype 将是整个列(系列)的字符串。但也许如果不是每一行都有相同数量的列,你最终会得到不可用的数据。我想你必须检查一下。【参考方案3】:

NaN 用作missing data consistently in pandas 的占位符,一致性好。我通常将 NaN 读/翻译为 “missing”另请参阅文档中的 'working with missing data' 部分。

Wes 在文档中写道'choice of NA-representation':

经过多年的生产使用 [NaN] 已经证明,至少在我看来,考虑到 NumPy 和 Python 的总体情况,它是最好的决定。 到处都使用特殊值 NaN (Not-A-Number) 作为 NA 值,并且有 API 函数 isnullnotnull 可以跨 dtypes 使用来检测 NA 值。 ... 因此,我选择了 Python 式的“实用性胜过纯度”方法,并用整数 NA 功能换取了一种更简单的方法,即在浮点数和对象数组中使用特殊值来表示 NA,并在必须引入 NA 时将整数数组提升为浮点数。

注意:"gotcha" that integer Series containing missing data are upcast to floats。

在我看来,使用 NaN(超过 None)的主要原因是它可以使用 numpy 的 float64 dtype 存储,而不是效率较低的 object dtype,请参阅NA type promotions

#  without forcing dtype it changes None to NaN!
s_bad = pd.Series([1, None], dtype=object)
s_good = pd.Series([1, np.nan])

In [13]: s_bad.dtype
Out[13]: dtype('O')

In [14]: s_good.dtype
Out[14]: dtype('float64')

Jeff cmets(下)对此:

np.nan 允许向量化操作;它是一个浮点值,而 None 根据定义强制对象类型,这基本上会禁用 numpy 中的所有效率。

所以快速重复 3 次:object==bad, float==good

话虽如此,许多操作在 None 和 NaN 中仍然可以正常工作(但可能不受支持,即它们有时可能会给出 surprising results):

In [15]: s_bad.sum()
Out[15]: 1

In [16]: s_good.sum()
Out[16]: 1.0

回答第二个问题: 您应该使用 pd.isnullpd.notnull 来测试缺失数据 (NaN)。

【讨论】:

只需在此处添加 2c....np.nan 允许矢量化操作;它是一个浮点值,而 None 根据定义强制 object 类型,并且基本上禁用了 numpy 中的所有效率,所以快速重复 3 次:object==bad, float==good <NA> 也是 np.nan 吗? 这个问题专门针对熊猫。这个答案太好了,为什么不先提出来?!【参考方案4】:

以下是区别:

nan 属于 floatNone 属于 NoneType

我发现下面的文章很有帮助: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review @A.Kootstra 我明白了

以上是关于NaN 和 None 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

IND和NAN号有啥区别

python中的[None]和[]有啥区别? [复制]

Python中的Pass和None有啥区别

“foo is None”和“foo == None”之间有啥区别吗?

测试“nil”和“.None”的可选项有啥区别?

border:none与border:0px有啥区别?