關於刪除數據集中含有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