NaN 和 None 有啥区别?
Posted
技术标签:
【中文标题】NaN 和 None 有啥区别?【英文标题】:What is the difference between NaN and None?NaN 和 None 有什么区别? 【发布时间】:2013-07-06 05:25:48 【问题描述】:我正在使用 pandas readcsv()
读取 csv 文件的两列,然后将值分配给字典。这些列包含数字和字母的字符串。偶尔会出现单元格为空的情况。在我看来,读取到该字典条目的值应该是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
不是数字。
@RobertHarvey 我知道,所以None
肯定会更好地描述空单元格的值。
【参考方案1】:
函数isnan()
检查某事物是否为“非数字”,并返回变量是否为数字,例如isnan(2)
将返回false
条件myVar is not None
返回变量是否定义
您的 numpy 数组使用 isnan()
,因为它是一个数字数组,并且它将数组的所有元素初始化为 NaN
这些元素被认为是“空的”
【讨论】:
我认为isnan(2)
会返回 False
,因为 2 不是 NaN。
另外,numpy.empty
不会将数组值初始化为 NaN
。它根本不初始化值。
对None
-ness 的正确检查是myVar is not None
,而不是myVar != None
。
请注意,np.isnan()
没有为字符串变量实现,所以如果你传递一个字符串它会崩溃。最好使用与字符串一起使用的pd.isnull
。【参考方案2】:
NaN
可以用作数学运算的数值,而None
不能(或至少不应该)。
NaN
是一个数值,在IEEE 754 floating-point standard 中定义。
None
是一个内部 Python 类型 (NoneType
),在这种情况下,它更像是“不存在”或“空”而不是“数值无效”。
其中的主要“症状”是,如果您对包含 NaN 的数组(甚至是单个数组)执行平均或求和,结果会得到 NaN...
另一方面,您不能使用None
作为操作数来执行数学运算。
因此,根据具体情况,您可以使用None
来告诉您的算法不要在计算中考虑无效或不存在的值。这意味着算法应该测试每个值以查看它是否为None
。
Numpy 有一些函数可以避免 NaN 值污染您的结果,例如 nansum
和 nan_to_num
。
【讨论】:
我同意你的观点,None 应该用于不存在的条目,那么为什么df=pd.readcsv('file.csv')
给我NaN
空单元格的值而不是None
?据我所知,pd.DataFrames 并不是数字专用的。
嗯,这可能是一种设计选择。我想DataFrames和Series有一个dtype
,所以dtype=float
的无效值必须用数值表示,NaN
是,None
不是(None
是NoneType
)。
另外,很多 Pandas 方法都有一个 na
参数,可以让你决定用哪个值来替换不可用的值
好的,谢谢。所以我实际上并没有将数字读入我的 DataFrame,而是数字和字母的字符串。我应该使用哪种检查来检测空单元格?支票之类的;如果 dtype==float: ??
或许发布一份 CSV 数据样本会有所帮助。我可以想象,如果有字符串,那么 dtype 将是整个列(系列)的字符串。但也许如果不是每一行都有相同数量的列,你最终会得到不可用的数据。我想你必须检查一下。【参考方案3】:
NaN 用作missing data consistently in pandas 的占位符,一致性好。我通常将 NaN 读/翻译为 “missing”。 另请参阅文档中的 'working with missing data' 部分。
Wes 在文档中写道'choice of NA-representation':
经过多年的生产使用 [NaN] 已经证明,至少在我看来,考虑到 NumPy 和 Python 的总体情况,它是最好的决定。 到处都使用特殊值 NaN (Not-A-Number) 作为 NA 值,并且有 API 函数
isnull
和notnull
可以跨 dtypes 使用来检测 NA 值。 ... 因此,我选择了 Python 式的“实用性胜过纯度”方法,并用整数 NA 功能换取了一种更简单的方法,即在浮点数和对象数组中使用特殊值来表示 NA,并在必须引入 NA 时将整数数组提升为浮点数。
注意:"gotcha" that integer Series containing missing data are upcast to floats。
在我看来,使用 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')
Jeff cmets(下)对此:
np.nan
允许向量化操作;它是一个浮点值,而None
根据定义强制对象类型,这基本上会禁用 numpy 中的所有效率。所以快速重复 3 次:object==bad, float==good
话虽如此,许多操作在 None 和 NaN 中仍然可以正常工作(但可能不受支持,即它们有时可能会给出 surprising results):
In [15]: s_bad.sum()
Out[15]: 1
In [16]: s_good.sum()
Out[16]: 1.0
回答第二个问题:
您应该使用 pd.isnull
和 pd.notnull
来测试缺失数据 (NaN)。
【讨论】:
只需在此处添加 2c....np.nan
允许矢量化操作;它是一个浮点值,而 None
根据定义强制 object
类型,并且基本上禁用了 numpy 中的所有效率,所以快速重复 3 次:object==bad, float==good
<NA>
也是 np.nan
吗?
这个问题专门针对熊猫。这个答案太好了,为什么不先提出来?!【参考方案4】:
以下是区别:
nan
属于 float
类
None
属于 NoneType
类
我发现下面的文章很有帮助: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review @A.Kootstra 我明白了以上是关于NaN 和 None 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章