在 pandas 中, NaN 始终用作缺失数据的占位符,一致性很好。我通常将 NaN 读/翻译为"missing"。另请参阅文档中的“处理缺失数据”部分。
Wes 在文档“选择 NA 表示”中写道:
经过多年的生产使用 [NaN] 已经证明,至少在我看来,考虑到 NumPy 和 Python 的总体情况,它是最好的决定。特殊值 NaN(非数字)在任何地方都isnull
用作 NA 值,并且有 API 函数notnull
可以跨 dtypes 使用来检测 NA 值。
...
因此,我选择了 Python 的“实用性胜过纯度”方法,并用整数 NA 功能换取了一种更简单的方法,即在浮点数和对象数组中使用特殊值来表示 NA,并在必须使用 NA 时将整数数组提升为浮点数介绍了。
注意:包含缺失数据的整数系列被向上转换为浮点数的“陷阱”。
在我看来,使用 NaN (over 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')
杰夫对此发表评论(如下):
np.nan
允许矢量化操作;它是一个浮点值,而None
根据定义,它强制对象类型,这基本上会禁用 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
andpd.notnull
来测试缺失数据 (NaN)。