Python numpy/大熊猫不稳定的NaN行为
我一直在尝试替换Pandas数据帧中丢失的值,但没有成功。我尝试了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
.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