numpy/pandas中NaN的不稳定行为

ybzsozfc  于 2023-11-15  发布在  其他
关注(0)|答案(2)|浏览(133)

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

dxxyhpgq

dxxyhpgq1#

您正在执行:

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(...)


或者,你必须传递inplace=True来改变你正在调用方法的对象。

g9icjywg

g9icjywg2#

pandas中的NaN可以用函数pandas.isnull检查。我创建了布尔掩码,并返回NaN值的子集。
函数fillna可以用于一列Smokinginpregnancy(更多信息在doc中):

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

字符串

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

警告:

有时候inplace=True可以忽略,最好不要用。-linkgithub,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不能比较相等性,但None可以。请注意,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

相关问题