熊猫:使用np.nan选择NaN值

时间:2017-09-19 16:49:48

标签: python python-3.x pandas

所以我发现浮动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)

1 个答案:

答案 0 :(得分:1)

如果您怀疑可能有pd.isnull,则应始终使用np.isnannan

例如,假设你有一个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.isinDataFrame.isin中未明确提及NaN支持,它可能只是一个实现细节,它正确地“找到”NaN。实施细节总是很难依赖。他们可以随时改变......

除此之外,明确表示永远是值得的。明确的isnullisnan检查应该(在我看来)是首选。