我一直在尝试替换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
我知道这一列中的第一项缺失,pandas将其识别为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发行版。
答案 0 :(得分:2)
你在做:
X['Smokinginpregnancy'][0] == np.nan
这是保证返回False
,因为所有NaN与IEEE754标准 的所有内容不相等:
>>> x = float('nan')
>>> x == x
False
>>> x == 1
False
>>> x == float('nan')
False
另见here。
您必须使用math.isnan
来检查NaN:
>>> math.isnan(x)
True
所以使用:
numpy.isnan(X['Smokinginpregnancy'][0])
关于pandas.fillna
请注意,此函数返回填充的数组。也许你做了类似的事情:
X.fillna(...)
没有重新分配X
?或者,您必须通过inplace=True
来改变调用方法的数据帧。
答案 1 :(得分:1)
NaN
可以检查函数pandas.isnull。我创建了布尔掩码并返回带有NaN
值的子集。
功能filnna可用于一列Smokinginpregnancy
(more info in doc):
X['Smokinginpregnancy'] = X['Smokinginpregnancy'].fillna('100')
或
X['Smokinginpregnancy'].fillna('100', inplace=True)
警告:强>
有时可以忽略inplace=True
,更好的是不使用。 - link,github,github 3 comments。
所有在一起:
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
。 Bakuriu's
回答中的更多信息。
In [11]: None == None
Out[11]: True
In [12]: np.nan == np.nan
Out[12]: False