我试图选择df
的行,其中列label
的值为None
。 (这是我从另一个函数而不是None
获得的值NaN
,
为什么df[df['label'].isnull()]
返回我想要的行,
但是df[df['label'] == None]
返回Empty DataFrame
Columns: [path, fanId, label, gain, order]
Index: []
吗?
答案 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>
与单例的比较(如“无”)应始终使用
is
或is not
进行,绝不能使用相等运算符。
例如,您可以执行tst.value.apply(lambda x: x is None)
,其结果与.isnull()
相同,说明pandas
如何将其视为 NaN 。 注意,这是下面的tst
数据帧示例,其中tst.value.dtypes
是object
,我已经明确指定了NoneType
元素。
pandas
文档中有一个不错的example,可以说明这一点及其效果。
例如,如果您有两列,其中一列为float
类型,另一列为object
,则可以看到熊猫如何很好地处理None
类型,请注意{{ 1}}使用的是 NaN 。
float
这篇文章很好地解释了 NaN 和 None 之间的区别,一定会看看这个。