NaN和None有什么区别?


94

我正在使用熊猫读取csv文件的两列,readcsv()然后将值分配给字典。这些列包含数字和字母字符串。有时在某些情况下单元格为空。在我看来,应读取None但应nan分配该字典条目的值。当然None,由于它具有空值,因此更能描述一个空单元格,而nan只是说读取的值不是数字。

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

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

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

但这给了我一个错误,说我不能使用此检查v。我猜这是因为要使用整数或浮点变量,而不是字符串。如果是这样,如何检查v“空单元” / nan盒?


文字qwerty不是数字。
罗伯特·哈维

1
@RobertHarvey我知道,所以肯定None可以更好地描述一个空单元格的值。
user1083734

Answers:


107

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

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

考虑到NumPy和Python的总体情况,经过多年的生产使用[NaN]已经证明是最好的决定。特殊值NaN(非-A-数)被用作到处作为NA值,并有API函数isnullnotnull可跨越dtypes被用于检测NA的值。
...
因此,我选择了Pythonic的“实用性胜过纯度”方法,并且将整数NA功能换成了更简单的方法,即在float和object数组中使用特殊值来表示NA,并在必须使用NA时将整数数组提升为float介绍。

注意:包含缺失数据的整数系列被转换为浮点数“陷阱”

在我看来,使用NaN(而不是None)的主要原因是它可以与numpy的float64 dtype一起存储,而不是效率较低的object dtype,请参阅NA type Promotions 。

#  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允许向量化操作;它是一个float值,而None根据定义,它强制对象类型,这基本上禁用了numpy中的所有效率。

因此,快速重复3次:object ==坏,float == good

说,许多操作在None vs NaN上仍然可以正常工作(但可能不受支持,即有时可能会产生令人惊讶的结果):

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

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

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


19
只需在此处添加2c ...即可np.nan进行矢量化操作;其浮点值,None根据定义是强制object类型,并且基本上禁用了numpy中的所有效率,因此请快速重复3遍:object==bad, float==good
Jeff

1
是否<NA>也是np.nan
盖德

18

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

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

其主要的“症状”是,如果您对包含NaN甚至是单个NaN的数组进行平均或求和,结果就是NaN ...

另一方面,您无法使用 None作为操作数的运算。

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

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


我同意您的意见,即对于不存在的条目,应使用“无”,那么为什么df=pd.readcsv('file.csv')给我NaN空白单元格的值而不是None?据我所知,pd.DataFrames不是数字专用的。
user1083734 2013年

好吧,这可能是设计选择。我想DataFrames和系列有dtype,这样的无效值的dtype=float必须由数字值,这被表示NaN为并且None不(None是的NoneType)。
heltonbiker

另外,许多Pandas方法都有一个na参数,可让您决定要使用哪个值来替换不可用的值
heltonbiker 2013年

好,谢谢。因此,我实际上不是将数字读入DataFrame中,而是将数字和字母字符串读入。我应该使用哪种检查来检测空细胞?支票像; 如果dtype == float:??
user1083734 2013年

也许发布您的CSV数据样本会有所帮助。我可以想象,如果有字符串,那么dtype将是整个列(系列)的字符串。但是,如果不是每一行都有相同的列数,那么最终您将获得不可用的数据。我认为您必须检查一下。
heltonbiker

3

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

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

您的numpy数组isnan()之所以使用,是因为它原本是一个数字数组,并且将数组的所有元素初始化为NaN这些元素,但这些元素被视为“空”


1
我想isnan(2)会回来的False,因为2不是NaN。
heltonbiker

另外,numpy.empty请勿将数组值初始化为NaN。它根本根本不初始化值。
heltonbiker

5
对于正确的检查None-ness是myVar is not None,没有myVar != None
Jaime

3
请注意,np.isnan()尚未为字符串变量实现此功能,因此,如果将其传递给字符串,则会崩溃。更好地pd.isnull与字符串一起使用。
2014年

-1

以下是区别:

  • nan 属于阶级 float
  • None 属于阶级 NoneType

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


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。- 评分
A. Kootstra

我了解@ A.Kootstra
eswara amirthan s

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.