Python numpy/大熊猫不稳定的NaN行为

Python numpy/大熊猫不稳定的NaN行为,python,numpy,pandas,Python,Numpy,Pandas,我一直在尝试替换Pandas数据帧中丢失的值,但没有成功。我尝试了.fillna方法,还尝试了在整个数据集中循环,检查每个单元格并用所选值替换NaN。但是,在这两种情况下,Python执行脚本时都不会抛出任何错误,但NaN值仍然存在 当我深入挖掘时,我发现行为对我来说似乎不稳定,最好用一个例子来说明: In[ ] X['Smokinginpregnancy'].head() Out[ ] Index E09000002 NaN E09000003 5.21612

我一直在尝试替换Pandas数据帧中丢失的值,但没有成功。我尝试了
.fillna
方法,还尝试了在整个数据集中循环,检查每个单元格并用所选值替换NaN。但是,在这两种情况下,Python执行脚本时都不会抛出任何错误,但NaN值仍然存在

当我深入挖掘时,我发现行为对我来说似乎不稳定,最好用一个例子来说明:

In[ ] X['Smokinginpregnancy'].head() 

Out[ ] 

Index
E09000002          NaN
E09000003     5.216126
E09000004    10.287496
E09000005     3.090379
E09000006     6.080041
Name: Smokinginpregnancy, dtype: float64
我知道这个专栏的第一个项目不见了,熊猫认出它是NaN。事实上,如果我单独调用此项,python会告诉我它是NaN:

In [ ] X['Smokinginpregnancy'][0]
Out [ ]
nan
然而,当我测试它是否为NaN时,python返回False

In [ ] X['Smokinginpregnancy'][0] == np.nan
Out [ ] False
我怀疑在执行
.fillna
时,python会检查该项是否为NaN,但返回一个False,因此它会继续,而不使用单元格

有人知道发生了什么事吗?有什么解决办法吗?(除了在excel中打开csv文件,然后手动替换值之外。)

我正在使用Anaconda的Python 3发行版。

您正在做:

X['Smokinginpregnancy'][0] == np.nan
这保证返回
False
,因为根据IEEE754标准,所有的NAN比较都不等于

>>> x = float('nan')
>>> x == x
False
>>> x == 1
False
>>> x == float('nan')
False
另见。 您必须使用来检查NAN:

>>> math.isnan(x)
True

因此,请使用:

numpy.isnan(X['Smokinginpregnancy'][0])

请注意,此函数返回填充的数组。也许你做了如下事情:

X.fillna(...)

没有重新分配
X
?或者,您必须传递
inplace=True
以改变调用该方法的数据帧。

NaN
中的pandas可以是check函数。我创建了布尔掩码并返回带有
NaN
值的子集

函数可用于一个列
smokinginpregncy
():

警告:
有时可以忽略
inplace=True
,最好不要使用。-

总而言之:

print X['Smokinginpregnancy'].head() 
#Index
#E09000002          NaN
#E09000003     5.216126
#E09000004    10.287496
#E09000005     3.090379
#E09000006     6.080041

#check NaN in column Smokinginpregnancy by boolean mask
mask = pd.isnull(X['Smokinginpregnancy'])
XNaN = X[mask]
print XNaN
#           Smokinginpregnancy
#Index
#E09000002                 NaN

#use function fillna for column Smokinginpregnancy
#X['Smokinginpregnancy'] = X['Smokinginpregnancy'].fillna('100')
X['Smokinginpregnancy'].fillna('100', inplace=True)
print X
#          Smokinginpregnancy
#Index
#E09000002                100
#E09000003           5.216126
#E09000004            10.2875
#E09000005           3.090379
#E09000006           6.080041
更多信息,为什么比较不起作用:

必须注意的是,在python(和numpy)中,nan并不相等,但没有一个是相等的。请注意,Pandas/numpy使用了
np.nan!=np.nan
,并将
None
视为
np.nan
。更多信息请参见巴库留的回答

In [11]: None == None
Out[11]: True

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

如果我帮助你,你可以投票并回答。虽然这从技术上说明了OP应该做什么,但它既不能解释“不稳定”的行为实际上是正常的,也是预期的(以及为什么),也不能解释为什么fillna一开始就不起作用。
print X['Smokinginpregnancy'].head() 
#Index
#E09000002          NaN
#E09000003     5.216126
#E09000004    10.287496
#E09000005     3.090379
#E09000006     6.080041

#check NaN in column Smokinginpregnancy by boolean mask
mask = pd.isnull(X['Smokinginpregnancy'])
XNaN = X[mask]
print XNaN
#           Smokinginpregnancy
#Index
#E09000002                 NaN

#use function fillna for column Smokinginpregnancy
#X['Smokinginpregnancy'] = X['Smokinginpregnancy'].fillna('100')
X['Smokinginpregnancy'].fillna('100', inplace=True)
print X
#          Smokinginpregnancy
#Index
#E09000002                100
#E09000003           5.216126
#E09000004            10.2875
#E09000005           3.090379
#E09000006           6.080041
In [11]: None == None
Out[11]: True

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