NaN 和 Nothing 有什么区别?

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

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

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

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

但是这给了我一个错误,即我不能使用这个检查 v。我猜这是因为要使用整数或浮点变量,而不是字符串。如果这是真的,我如何检查 v的“空细胞”/nan的情况?

138123 次浏览

函数 isnan()检查某些内容是否为“ Not A Number”,并返回变量是否为数字,例如 isnan(2)将返回 false

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

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

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

NaN是在 IEEE 754浮点数标准中定义的一个数值。 None是一种内部 Python 类型(NoneType) ,在此上下文中更像是“不存在”或“空”,而不是“数值无效”。

这种情况的主要“症状”是,如果对一个包含 NaN 的数组执行平均值或求和操作,即使只有一个,结果也会得到 NaN..。

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

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

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

NaN 被用作 熊猫数据缺失的占位符,一致性很好。我通常把 NaN 读作 “失踪”另请参阅文档中的 < a href = “ https://anda-docs.github.io/anda-docs-Travis/miss _ data.html”rel = “ noReferrer”> ‘ working with miss data’ 部分。

韦斯在 “选择 NA 代表”的文件中写道:

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

注: “明白了”,包含丢失数据的整数系列被上传到浮点数

在我看来,使用 NaN (over Nothing)的主要原因是它可以存储为 numpy 的 float64 dtype,而不是效率较低的对象 dtype 参见: http://panas.pydata.org/anda-docs/dev/gotchas.html # NA-type- 促進”rel = “ noReferrer”> NA type 促進

#  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 对此的评论如下:

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

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

也就是说,很多操作可能仍然可以很好地使用 Nothing 和 NaN (但可能不支持,也就是说,它们有时可能会给出 令人惊讶的结果) :

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


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

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

以下是不同之处:

  • nan属于 float
  • None属于 NoneType

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