NaN 和 None 有什么区别?
- 2025-01-07 08:45:00
- admin 原创
- 123
问题描述:
我正在使用 pandas 读取 csv 文件的两列readcsv()
,然后将这些值分配给一个字典。这些列包含数字和字母的字符串。偶尔会出现单元格为空的情况。在我看来,读取到该字典条目的值应该是,None
但却nan
被分配了。当然,None
这更能描述一个空单元格,因为它有一个空值,而nan
只是说读取的值不是数字。
None
我的理解是否正确,和之间有什么区别nan
?为什么nan
分配的是而不是None
?
此外,我的字典检查是否有任何空单元格一直使用numpy.isnan()
:
for k, v in my_dict.iteritems():
if np.isnan(v):
但这给了我一个错误,说我不能用这个检查v
。我猜是因为应该使用整数或浮点变量,而不是字符串。如果这是真的,我该如何检查v
“空单元格”/nan
案例?
解决方案 1:
NaN在 pandas 中始终用作缺失数据的占位符,一致性很好。我通常将 NaN 读作/翻译为“缺失”。另请参阅文档中的“处理缺失数据”部分。
Wes 在文档‘NA 表示的选择’中写道:
经过多年的生产使用,[NaN] 已被证明是 NumPy 和 Python 总体状况下的最佳决策,至少在我看来是这样。特殊值 NaN(非数字)在任何地方都用作NA 值,并且有 API 函数
isna
和notna
可用于跨 dtype 检测 NA 值。...因此
,我选择了 Pythonic“实用性胜过纯粹性”方法,并将整数 NA 功能换成一种更简单的方法,即在浮点和对象数组中使用特殊值来表示 NA,并在必须引入 NA 时将整数数组提升为浮点数。
注意:包含缺失数据的整数系列被向上转换为浮点数。
在我看来,使用 NaN(而不是 None)的主要原因是它可以与 numpy 的 float64 dtype 一起存储,而不是效率较低的对象 dtype,请参阅NA 类型提升。
# 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 对此的评论如下:
np.nan
允许矢量化操作;它是一个浮点值,而None
根据定义,强制对象类型,这基本上禁用了 numpy 中的所有效率。因此快速重复 3 遍:object==坏,float==好
话虽如此,许多操作可能仍然可以与 None 和 NaN 一样有效(但可能不受支持,即它们有时可能会产生令人惊讶的结果):
In [15]: s_bad.sum()
Out[15]: 1
In [16]: s_good.sum()
Out[16]: 1.0
回答第二个问题:
您应该使用isna
和notna
来测试缺失数据(NaN)。
解决方案 2:
NaN
可以在数学运算中用作数值,而None
不能(或至少不应该)。
NaN
是一个数值,如IEEE 754 浮点标准中所定义。None
是 Python 的内部类型 ( NoneType
),并且在这种情况下更像是“不存在”或“空”,而不是“数值无效”。
其主要的“症状”是,如果你对包含 NaN 的数组执行平均值或总和,即使只有一个 NaN,结果也会是 NaN……
另一方面,您不能使用它None
作为操作数执行数学运算。
因此,根据具体情况,您可以使用None
来告诉算法不要在计算中考虑无效或不存在的值。这意味着算法应该测试每个值以查看它是否None
。
Numpy 有一些函数可以避免 NaN 值污染你的结果,例如nansum
和nan_to_num
。
解决方案 3:
该函数isnan()
检查某个东西是否“不是数字”,并返回变量是否为数字,例如isnan(2)
返回 false。
条件myVar is not None
返回变量是否被定义
您的 numpy 数组使用,isnan()
因为它旨在成为一个数字数组,并且它将数组的所有元素初始化为NaN
这些元素被视为“空”
解决方案 4:
以下是差异:
nan
属于阶级float
None
属于阶级NoneType
我发现以下文章非常有用:
https: //medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31