关于删除数据集中含有NaN
、inf
等异常值,有不少种方法,在stackoverflow的这个问题下,高票回答中使用的方法python
df[~df.isin([np.nan, np.inf, -np.inf]).any(1)]
在某些状况下并不可行,缘由在于所使用的isin
是基于等号==
进行判断数值是否相等的,而在Python中运行np.nan == np.nan
时,结果为False
,故而在有些数据集下没法删除含有NaN
的样本(按理说应该在全部数据集下均没法删除含有NaN
的样本才对,可是在某些数据集下又可以删除,好比上述stackoverflow帖子中的状况,目前仍是没有彻底弄懂)。
若是必定要用相似于上述isin
的方式删除含有NaN
的样本,能够本身写一个NaN类(见参考连接3最后一个回答),用np.isnan()
来判断两个NaN
值是否相等,由于np.isnan(np.nan)
返回的是True
。具体方法以下:学习
import numpy as np class NaN(): def __eq__(self, v): return np.isnan(v) def __hash__(self): return hash(np.nan) nan = NaN() df[~df.isin([nan]).any(1)]
另外,虽然np.nan == np.nan
时,结果为False
,可是np.inf == np.inf
时,结果为True
。因此能够直接用df[~df.isin([inf]).any(1)]
来删除含有inf
的样本,无须单独写一个类。
若是不想像上面那样本身写一个类来删除含有NaN
的样本,最简单也比较保险的作法就是在code
df[~df.isin([np.nan, np.inf, -np.inf]).any(1)]
后面再加一个dropna()
,即用rem
df[~df.isin([np.nan, np.inf, -np.inf]).any(1)].dropna()
即可同时清除含有NaN
、inf
和-inf
等异常值的样本,固然isin
里面的np.nan
可要可不要。
还有一种处理方式是将除NaN
的其他异常值均替换成NaN
,最后统一dropna()
一下便可,get
df.replace([np.inf, -np.inf], np.nan).dropna()
最后,这里有一篇文章详细地介绍了Python中None
和NaN
的区别,有兴趣的能够学习学习。pandas
[1] https://stackoverflow.com/questions/45745085/python-pandas-how-to-remove-nan-and-inf-values
[2] https://stackoverflow.com/questions/1565164/what-is-the-rationale-for-all-comparisons-returning-false-for-ieee754-nan-values
[3] https://stackoverflow.com/questions/31833635/pandas-checking-for-nan-not-working-using-isinhash