Python NaN和None有什么区别?
我正在使用pandasPython NaN和None有什么区别?,python,numpy,pandas,nan,Python,Numpy,Pandas,Nan,我正在使用pandasreadcsv()读取csv文件的两列,然后将值分配给字典。这些列包含数字和字母字符串。有时也会出现单元格为空的情况。在我看来,读取到该词典条目的值应该是None,而不是nan。当然,None更能描述空单元格,因为它有一个空值,而nan只是说读取的值不是一个数字 我的理解正确吗,None和nan之间有什么区别?为什么分配了nan而不是None 此外,我的字典一直在使用numpy.isnan()检查是否有空单元格: 但这给了我一个错误,即我不能将此检查用于v。我猜这是因为要使
readcsv()
读取csv文件的两列,然后将值分配给字典。这些列包含数字和字母字符串。有时也会出现单元格为空的情况。在我看来,读取到该词典条目的值应该是None
,而不是nan
。当然,None
更能描述空单元格,因为它有一个空值,而nan
只是说读取的值不是一个数字
我的理解正确吗,None
和nan
之间有什么区别?为什么分配了nan
而不是None
此外,我的字典一直在使用numpy.isnan()
检查是否有空单元格:
但这给了我一个错误,即我不能将此检查用于
v
。我猜这是因为要使用的是整数或浮点变量,而不是字符串。如果这是真的,我如何检查v
是否有“空单元格”/nan
案例?nan
状态是否为非数字None
可能代表anyNaN
表示非数字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