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函数
isnull
和notnull
可以在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.isnull
和pd.notnull
来testing缺less的数据(NaN)。
NaN
可以用作math运算的数值,而None
不能(或者至less不应该))。
NaN
是IEEE 754浮点标准中定义的数值。 None
一个是内部的Python NoneType
( NoneType
),在这种情况下更像是“不存在”或“空白”而不是“数字无效”。
主要的“症状”是,如果你在一个包含NaN的数组(甚至是单个数组)上执行一个平均值或者一个和,那么你会得到NaN …
另一方面,不能用None
作为操作数来进行math运算。
因此,根据具体情况,可以使用None
作为一种方法来告诉algorithm不要在计算时考虑无效或不存在的值。 这意味着algorithm应该testing每个值,看它是否为None
。
Numpy有一些函数可以避免NaN值污染你的结果,比如nansum
和nan_to_num
。
函数isnan()
检查是否是“不是一个数字”,并将返回一个variables是否是一个数字,例如isnan(2)
将返回false
条件myVar is not None
返回是否定义variables
你的numpy数组使用isnan()
因为它是一个数组的数组,它初始化数组的所有元素为NaN
这些元素被认为是“空的”
NaN
支持不是一个数字 。
None
可以代表任何人 。