NaN和None有何区别?

我正在使用pandas readcsv()读取csv文件的两列,然后将值分配给字典。 这些列包含数字和字母的string。 偶尔有一些单元格是空的情况。 在我看来,读入该字典条目的值应该是None而不是nan 。 毫无疑问,空白单元格更具描述性,因为空单元格的值是空值,而nan表示读取的值不是数字。

我的理解是否正确, None与有什么区别? 为什么是nan而不是None

另外,我的字典检查任何空单元格已经使用numpy.isnan()

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

但这给了我一个错误,说我不能使用这个检查v 。 我想这是因为一个整数或浮点型variables,而不是一个string是为了使用。 如果这是真的,我怎么能检查一个“空细胞”/ nan案?

NaN 在pandas中被用作遗漏数据的占位符,一致性好。 我通常阅读/翻译NaN为“失踪”另请参阅文档中的“处理丢失的数据”部分。

Wes在文档中select“NA表示”中写道:

经过多年的生产使用[NaN]已经certificate,至less在我看来,是对NumPy和Python一般情况的最好的决定。 NaN(Not-A-Number)的特殊值被用作NA的值,API函数isnullnotnull可以在dtypes中用来检测NA值。

因此,我select了Pythonic的“实用性节拍纯度”方法,并且使用浮点数和对象数组中的特殊值来表示NA,并且在必须引入NA时促进整数数组浮动,这种方法简单得多。

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

在我看来,使用NaN(over None)的主要原因是它可以用numpy的float64 dtype存储,而不是效率较低的对象dtype, 参见NAtypes的促销

 # 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定义,强制对象types,基本上禁用numpy的所有效率。

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

说,许多操作仍然可以与None和NaN一样工作(但可能不被支持,即它们有时可能给出令人惊讶的结果 ):

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

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

NaN可以用作math运算的数值,而None不能(或者至less不应该))。

NaN是IEEE 754浮点标准中定义的数值。 None一个是内部的Python NoneTypeNoneType ),在这种情况下更像是“不存在”或“空白”而不是“数字无效”。

主要的“症状”是,如果你在一个包含NaN的数组(甚至是单个数组)上执行一个平均值或者一个和,那么你会得到NaN …

另一方面,不能用None作为操作数来进行math运算。

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

Numpy有一些函数可以避免NaN值污染你的结果,比如nansumnan_to_num

函数isnan()检查是否是“不是一个数字”,并将返回一个variables是否是一个数字,例如isnan(2)将返回false

条件myVar is not None返回是否定义variables

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

NaN支持不是一个数字
None可以代表任何人