[英]What is the difference between NaN and None?
我正在使用 pandas readcsv()
读取 csv 文件的两列,然后将值分配给字典。 列包含数字和字母字符串。 偶尔会出现单元格为空的情况。 在我看来,读取到该字典条目的值应该是None
而是分配了nan
。 当然None
更能描述空单元格,因为它有一个空值,而nan
只是说读取的值不是数字。
我的理解是否正确, None
和nan
之间有什么区别? 为什么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 函数
isnull
和notnull
可用于跨 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.isnull
和pd.notnull
来测试缺失数据 (NaN)。
NaN
可以用作数学运算的数值,而None
不能(或至少不应该)。
NaN
是一个数值,如IEEE 754 浮点标准中所定义。 None
是内部 Python 类型( NoneType
),在这种情况下,它更像是“不存在”或“空”而不是“数字无效”。
其主要的“症状”是,如果您对包含 NaN 的数组(即使是单个数组)执行平均值或求和,结果会得到 NaN ......
另一方面,您不能使用None
作为操作数执行数学运算。
因此,根据情况,您可以使用None
作为一种方式来告诉您的算法不要在计算中考虑无效或不存在的值。 这意味着算法应该测试每个值以查看它是否为None
。
Numpy 有一些函数可以避免 NaN 值污染您的结果,例如nansum
和nan_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.