所以我发现浮动NaN显然是doesn't equal itself。我的问题是如何处理它。让我们从数据框开始:
DF = pd.DataFrame({'X':[0, 3, None]})
DF
X
0 0.0
1 3.0
2 NaN
DF['test1'] = np.where(DF['X'] == np.nan, 1, 0)
DF['test2'] = np.where(DF['X'].isin([np.nan]), 1, 0)
DF
X test1 test2
0 0.0 0 0
1 3.0 0 0
2 NaN 0 1
所以test1和test2不一样。许多其他人提到我们应该使用pd.isnull()
。我的问题是,使用isin()
是否安全?例如,如果我需要使用np.where创建一个新列,我可以简单地执行:
DF['test3'] = np.where(DF['X'].isin([0, np.nan]), 1, 0)
或者我应该像这样使用pd.isnull
:
DF['test3'] = np.where((DF['X'] == 0) | (pd.isnull(DF['X'])), 1, 0)
答案 0 :(得分:1)
如果您怀疑可能有pd.isnull
,则应始终使用np.isnan
或nan
。
例如,假设你有一个object
- dtype列(不幸的是,这些并不罕见):
X
0 a
1 3
2 NaN
然后使用isin
将无法为您提供正确的结果:
>>> df['X'].isin([np.nan])
0 False
1 False
2 False
Name: X, dtype: bool
虽然isnull
仍然可以正常运行:
>>> df['X'].isnull()
0 False
1 False
2 True
Name: X, dtype: bool
鉴于在Series.isin
和DataFrame.isin
中未明确提及NaN
支持,它可能只是一个实现细节,它正确地“找到”NaN。实施细节总是很难依赖。他们可以随时改变......
除此之外,明确表示永远是值得的。明确的isnull
或isnan
检查应该(在我看来)是首选。