繁体   English   中英

NaN 和 None 有什么区别?

[英]What is the difference between NaN and None?

我正在使用 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情况?

NaN被用作占位符的大熊猫一直缺失的数据,一致性好等特点。 我通常阅读/翻译 NaN 为"missing" 另请参阅文档中的“处理缺失数据”部分。

Wes 在文档“选择 NA 表示”中写道:

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

注意: 包含缺失数据的整数系列被向上转换为 floats“问题”

在我看来,使用 NaN(超过 None)的主要原因是它可以与 numpy 的 float64 dtype 一起存储,而不是效率较低的对象 dtype,请参阅NA 类型促销

#  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')

杰夫对此评论(如下):

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

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

也就是说,许多操作可能仍然适用于 None 与 NaN(但可能不受支持,即它们有时可能会给出令人惊讶的结果):

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

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

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

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

NaN是一个数值,如IEEE 754 浮点标准中所定义。 None是内部 Python 类型( NoneType ),在这种情况下,它更像是“不存在”或“空”而不是“数字无效”。

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

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

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

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

函数isnan()检查某些东西是否“不是数字”,并返回变量是否为数字,例如isnan(2)将返回 false

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

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

以下是差异:

  • nan属于float
  • None属于类NoneType

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

NaN数字的NaN
None可能代表any

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM