numpy / pandas

时间:2015-11-07 11:42:35

标签: python numpy pandas

我一直在尝试替换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发行版。

2 个答案:

答案 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

所以使用:

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

关于pandas.fillna请注意,此函数返回填充的数组。也许你做了类似的事情:

X.fillna(...)

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

答案 1 :(得分:1)

pandas中的

NaN可以检查函数pandas.isnull。我创建了布尔掩码并返回带有NaN值的子集。

功能filnna可用于一列Smokinginpregnancymore info in doc):

X['Smokinginpregnancy'] = X['Smokinginpregnancy'].fillna('100')

X['Smokinginpregnancy'].fillna('100', inplace=True)

警告:
有时可以忽略inplace=True,更好的是不使用。 - linkgithubgithub 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.nanBakuriu's回答中的更多信息。

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

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