NaN和None之间有什么区别?

时间:2013-07-08 19:06:18

标签: python numpy pandas nan

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

5 个答案:

答案 0 :(得分:77)

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

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

  

经过多年的生产使用[NaN]至少在我看来已经证明,鉴于NumPy和Python的一般情况,它是最好的决定。特殊值NaN(Not-A-Number)用作无处不在的作为NA值,并且有API函数isnullnotnull可以在dtypes中使用检测NA值   ...
  因此,我选择了Pythonic“实用性节拍纯度”方法并交换整数NA能力,以便在浮点数和对象数组中使用特殊值来表示NA,并在必须引入NA时将整数数组提升为浮点数。 / p>

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

在我看来,使用NaN(over None)的主要原因是它可以使用numpy的float64 dtype存储,而不是效率较低的对象dtype,请参阅NA type promotions 。< / p>

#  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次:对象==坏,浮动==好

  

如果说,许多操作可能仍然可以与None vs NaN一起使用(但可能不受支持,即他们有时可能会给surprising results):

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

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

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

答案 1 :(得分:15)

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

NaN是一个数值,如IEEE 754 floating-point standard中所定义。 None是一个内部Python tipe(NoneType),在此上下文中更像是“不存在”或“空”而不是“数字无效”。

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

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

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:-1)

以下是区别:

  • nan属于类float
  • None属于类NoneType

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

答案 4 :(得分:-3)

NaN暂停非数字 None可能代表 任何