127

我正在使用 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案例?

4

4 回答 4

133

在 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.isnullandpd.notnull来测试缺失数据 (NaN)。

于 2013-07-08T19:43:37.483 回答
24

NaN可以用作数学运算的数值,而None不能(或至少不应该)。

NaN是一个数值,如IEEE 754 浮点标准中所定义。 None是一个内部 Python 类型 ( NoneType),在这种情况下,它更像是“不存在”或“空”而不是“数值无效”。

其主要“症状”是,如果您对包含 NaN 的数组(即使是单个数组)执行平均或求和,结果也会得到 NaN ......

另一方面,您不能使用Noneas 操作数执行数学运算。

因此,根据具体情况,您可以使用None一种方式告诉您的算法不要在计算中考虑无效或不存在的值。这意味着算法应该测试每个值以查看它是否为None.

Numpy 有一些功能可以避免 NaN 值污染您的结果,nansum例如nan_to_num

于 2013-07-08T19:16:25.820 回答
3

该函数isnan()检查某事物是否为“非数字”,并将返回变量是否为数字,例如isnan(2)返回 false

条件myVar is not None返回变量是否定义

您使用 numpy 数组isnan()是因为它旨在成为一个数字数组,并且它将数组的所有元素初始化为NaN这些元素被认为是“空的”

于 2013-07-08T19:11:42.873 回答
-1

以下是不同之处:

  • nan属于类float
  • None属于类NoneType

我发现以下文章非常有帮助: https ://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31

于 2020-01-18T15:20:20.210 回答