为什么熊猫isull()有效但== None无效?

时间:2019-10-01 19:14:19

标签: python python-3.x pandas

我试图选择df的行,其中列label的值为None。 (这是我从另一个函数而不是None获得的值NaN

为什么df[df['label'].isnull()]返回我想要的行,

但是df[df['label'] == None]返回Empty DataFrame Columns: [path, fanId, label, gain, order] Index: []吗?

1 个答案:

答案 0 :(得分:3)

如上面的评论所述,pandas中丢失的数据由 NaN 表示,其中 NaN 是数值,即浮点型。但是 None 是Python NoneType,因此 NaN 不会等同于 None

In [27]: np.nan == None
Out[27]: False

在此Github thread中,他们进一步讨论,并指出:

  

这样做是为了使null的行为保持一致,因为它们之间的比较并不相等。这样会将None和np.nan置于平等的地位(尽管与python不一致,但与numpy一致)。

这意味着当您执行df[df['label'] == None]时,您将elementwise检查是否为np.nan == np.nan,我们知道这是错误的。

In [63]: np.nan == np.nan
Out[63]: False

此外,在应用Boolean indexing时,您不应该执行df[df['label'] == None],因为PEP8提到了,==并不是NoneType的最佳做法:< / p>

  

与单例的比较(如“无”)应始终使用isis not进行,绝不能使用相等运算符。

例如,您可以执行tst.value.apply(lambda x: x is None),其结果与.isnull()相同,说明pandas如何将其视为 NaN 注意,这是下面的tst数据帧示例,其中tst.value.dtypesobject,我已经明确指定了NoneType元素。

pandas文档中有一个不错的example,可以说明这一点及其效果。

例如,如果您有两列,其中一列为float类型,另一列为object,则可以看到熊猫如何很好地处理None类型,请注意{{ 1}}使用的是 NaN

float

这篇文章很好地解释了 NaN None 之间的区别,一定会看看这个。