Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NaN和None有什么区别?_Python_Numpy_Pandas_Nan - Fatal编程技术网

Python NaN和None有什么区别?

Python NaN和None有什么区别?,python,numpy,pandas,nan,Python,Numpy,Pandas,Nan,我正在使用pandasreadcsv()读取csv文件的两列,然后将值分配给字典。这些列包含数字和字母字符串。有时也会出现单元格为空的情况。在我看来,读取到该词典条目的值应该是None,而不是nan。当然,None更能描述空单元格,因为它有一个空值,而nan只是说读取的值不是一个数字 我的理解正确吗,None和nan之间有什么区别?为什么分配了nan而不是None 此外,我的字典一直在使用numpy.isnan()检查是否有空单元格: 但这给了我一个错误,即我不能将此检查用于v。我猜这是因为要使

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

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

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


但这给了我一个错误,即我不能将此检查用于
v
。我猜这是因为要使用的是整数或浮点变量,而不是字符串。如果这是真的,我如何检查
v
是否有“空单元格”/
nan
案例?

nan
状态是否为非数字

None
可能代表any

NaN
表示非数字
None
可能代表any

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

条件
myVar不是None
返回变量是否已定义

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

函数检查某个元素是否“不是数字”,并返回某个变量是否是数字,例如
isnan(2)
将返回false

条件
myVar不是None
返回变量是否已定义


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

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

NaN
是一个数值,如中所定义。
None
是一种内部Python类型(
NoneType
),在本文中更像是“不存在”或“空”,而不是“数字无效”

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

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

这样,根据情况,您可以使用<代码> NON/COMP>作为告诉您的算法不考虑计算中无效或不存在的值的一种方式。这意味着算法应该测试每个值,看看它是否为

None


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

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

NaN
是一个数值,如中所定义。
None
是一种内部Python类型(
NoneType
),在本文中更像是“不存在”或“空”,而不是“数字无效”

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

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

这样,根据情况,您可以使用<代码> NON/COMP>作为告诉您的算法不考虑计算中无效或不存在的值的一种方式。这意味着算法应该测试每个值,看看它是否为

None


Numpy有一些函数可以避免NaN值污染您的结果,例如
nansum
NaN_to_num

NaN用作的占位符,一致性很好。我通常把NaN读/译为“失踪”。另请参见文档中的部分

韦斯在文件中写道:

经过多年的生产使用,至少在我看来,考虑到NumPy和Python的总体状况,使用[NaN]已经被证明是最好的决定。特殊值NaN(不是数字)在任何地方都用作NA值,并且有API函数,可以跨数据类型使用它们来检测NA值。

因此,我选择了Pythonic的“实用性优于纯度”方法,并将整数NA功能转换为一种更简单的方法,即在浮点和对象数组中使用特殊值来表示NA,并在必须引入NAs时将整数数组升级为浮点数组

注:附件

在我看来,使用NaN(优于None)的主要原因是它可以与numpy的float64数据类型一起存储,而不是使用效率较低的对象数据类型,请参阅

Jeff对此发表了评论(如下):

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

所以快速重复3次:object==坏,float==好

也就是说,许多操作在None vs NaN的情况下仍然可以正常工作(但可能不受支持,即它们有时可能提供):

回答第二个问题:

您应该使用和来测试丢失的数据(NaN)。

NaN用作的占位符,一致性良好。我通常把NaN读/译为“失踪”
for k, v in my_dict.iteritems():
    if np.isnan(v):
#  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')
In [15]: s_bad.sum()
Out[15]: 1

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