NaN 用作占位符缺失数据始终如一地在熊猫中 https://pandas.pydata.org/pandas-docs/dev/user_guide/gotchas.html#choice-of-na-representation,一致性好。我通常将 NaN 读/翻译为“丢失的”. 另请参阅“处理丢失的数据” https://pandas.pydata.org/docs/user_guide/missing_data.html文档中的部分。
韦斯在文档中写道“NA 代表的选择” https://pandas.pydata.org/pandas-docs/dev/user_guide/gotchas.html#choice-of-na-representation:
经过多年的生产使用,至少在我看来,[NaN] 已被证明是考虑到 NumPy 和 Python 的总体状况的最佳决定。使用特殊值 NaN(非数字)到处作为NA值,并且有API函数isna https://pandas.pydata.org/pandas-docs/dev/reference/api/pandas.DataFrame.isna.html#pandas.DataFrame.isna and notna https://pandas.pydata.org/pandas-docs/dev/reference/api/pandas.DataFrame.notna.html#pandas.DataFrame.notna它可以跨数据类型使用来检测 NA 值。
...
因此,我选择了 Python 式的“实用胜于纯粹”方法,并将整数 NA 功能换成了一种更简单的方法,即使用浮点和对象数组中的特殊值来表示 NA,并在必须引入 NA 时将整数数组提升为浮点。
注:“发现”包含缺失数据的整数系列被向上转换为浮点数 https://pandas.pydata.org/pandas-docs/dev/user_guide/gotchas.html#support-for-integer-na.
在我看来,使用 NaN (而不是 None)的主要原因是它可以使用 numpy 的 float64 数据类型存储,而不是效率较低的对象数据类型,see NA型促销 https://pandas.pydata.org/pandas-docs/dev/user_guide/gotchas.html#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 一起使用(但可能不受支持,即它们有时可能会给出令人惊讶的结果 https://stackoverflow.com/a/19866269/1240268):
In [15]: s_bad.sum()
Out[15]: 1
In [16]: s_good.sum()
Out[16]: 1.0
回答第二个问题:
你应该使用isna https://pandas.pydata.org/pandas-docs/dev/reference/api/pandas.DataFrame.isna.html#pandas.DataFrame.isna and notna https://pandas.pydata.org/pandas-docs/dev/reference/api/pandas.DataFrame.notna.html#pandas.DataFrame.notna测试缺失数据 (NaN)。