NaN和None之间有什么区别?

use*_*734 83 python numpy nan pandas

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

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

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

for k, v in my_dict.iteritems():
    if np.isnan(v):
Run Code Online (Sandbox Code Playgroud)

但是这给了我一个错误,说我不能使用这个检查v.我想这是因为要使用整数或浮点变量,而不是字符串.如果是这样,我该如何检查v"空单元格"/ nan案例?

And*_*den 94

NaN被用作占位符丢失的数据一致的大熊猫,一致性好等特点.我通常将NaN读/翻译为"缺失".另请参阅文档中的"使用缺少数据"部分.

Wes在文档中选择了NA-representation':

经过多年的生产使用[NaN]至少在我看来已经证明,鉴于NumPy和Python的一般情况,它是最好的决定.特殊值NaN(非-A-数)被用作到处作为NA值,并有API函数isnullnotnull可跨越dtypes被用于检测NA的值.
...
因此,我选择了Pythonic"实用性节拍纯度"方法并交换了整数NA功能,以便在浮点数和对象数组中使用特殊值来表示NA,并在NAs必须为时将整数数组提升为浮点数.介绍.

注意:包含缺失数据的整数系列"gotcha"被上传到浮点数.

在我看来,使用NaN(over 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')
Run Code Online (Sandbox Code Playgroud)

杰夫评论(下面):

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

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

这么说,许多操作可能仍然可以与None vs NaN一样好(但可能不受支持,即它们有时会产生令人惊讶的结果):

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

In [16]: s_good.sum()
Out[16]: 1.0
Run Code Online (Sandbox Code Playgroud)

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

  • 这里只添加2c ....``np.nan``允许矢量化操作; 它是一个浮点值,而``None``定义强制``object``类型,并且基本上禁用numpy中的所有效率,所以快速重复3次:``object == bad,float == good`` (18认同)
  • `<NA>` 也是一个 `np.nan` 吗? (3认同)

hel*_*ker 16

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

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

其中的主要"症状"是,如果你对包含NaN的数组执行平均值或求和,即使是单个数组,也会得到NaN作为结果......

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

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

NumPy的有一些功能,以避免NaN值污染的结果,如nansumnan_to_num例如.

  • 我同意你的观点, None 应该用于不存在的条目,那么为什么 `df=pd.readcsv('file.csv')` 给我空单元格的 `NaN` 值而不是 `None` ?据我所知, pd.DataFrames 并不专用于数字。 (2认同)