如何一分鐘內(nèi)找出pandas DataFrame某列中的nan值
一分鐘內(nèi)找出pandas DataFrame某列中的nan值
例如
對格式為DataFrame的變量element,找出其中TEM列里所有的nan值
element=read_element(TRHCLO_data_path,end_trans,sta_info)
步驟一
element_right=element[~(np.isnan(element["TEM"]))] #(element["TEM"]).isna() element_nan=(element[np.isnan(element["TEM"])])
此時程序報錯:
ufunc ‘isnan’ not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ‘‘safe’’
步驟二
對查詢列(TEM列)的數(shù)據(jù)類型進(jìn)行一次標(biāo)準(zhǔn)處理即可
element["TEM"]=(element["TEM"]).astype(float) #對下面的np.isnan查詢很必要,否則會報格式錯誤 element_right=element[~(np.isnan(element["TEM"]))] element_nan=(element[np.isnan(element["TEM"])])
dataframe缺失值(NaN)處理
在進(jìn)行機(jī)器學(xué)習(xí)的特征工程時,常常需要根據(jù)選擇的機(jī)器學(xué)習(xí)算法,采用合適的數(shù)據(jù)預(yù)處理方式,特別是對于對于空值(NaN)的處理,常常使人感到困惑。
一般對于NaN,常常有兩種處理方式。
- 第一種——填補(bǔ)
- 第二種——不處理
當(dāng)你使用sklearn庫進(jìn)行機(jī)器學(xué)習(xí)訓(xùn)練時,一般對于缺失值要求較為嚴(yán)格,因此,需要進(jìn)行填補(bǔ),至于填補(bǔ)為何值,則需要根據(jù)業(yè)務(wù)需求進(jìn)行。
當(dāng)你使用lightgbm庫一類庫進(jìn)行機(jī)器學(xué)習(xí)訓(xùn)練時,一般不需要處理缺失值,因為這類算法,天然支持缺失值處理,它會將缺失值單獨分為一類。
本人認(rèn)為,數(shù)據(jù)的缺失,在實際中是存在一定的業(yè)務(wù)含義的,例如月收入的缺失,就反應(yīng)人對于自己收入的不自信,因此在風(fēng)控領(lǐng)域就存在更容易逾期現(xiàn)象。但此時若是進(jìn)行均值的缺失值填補(bǔ),則會使該業(yè)務(wù)含義消失,因此我覺得是不可取的。
數(shù)據(jù)的特征工程決定數(shù)據(jù)質(zhì)量,數(shù)據(jù)質(zhì)量決定模型效果上限,模型參數(shù)決定訓(xùn)練的模型能否逼近理論模型,特征工程的難易復(fù)雜程度決定模型最終上線的工作量。
(以上為本人的一點點見解)
判斷缺失值的函數(shù)有:np.isnan()/ pd.isna()/pd.isnull()。
- np.isnan():一般用于單個值,也可以用于Series或者DataFrame,但是這里存在一個坑,np.isnan()判斷datetime類型的Series或者DataFrame會報錯。
- pd.isna()和pd.isnull():用的比較多,一般推薦使用pd.isna()
s1 = pd.Series([1,2,3,np.nan]) np.isnan(s1) >>> 0 False 1 False 2 False 3 True dtype: bool pd.isna(s1) >>> 0 False 1 False 2 False 3 True dtype: bool pd.isnull(s1) >>> 0 False 1 False 2 False 3 True dtype: bool
除了以上的方法之外,還有一種較為方便和萬能的方法來判斷缺失值,取出非缺失值進(jìn)行處理(本人一般也采用這種方法)。
通過對np.nan==np.nan發(fā)現(xiàn),np.nan是不會等于np.nan,因此我們可以通過以下方式取出非缺失值。
np.nan==np.nan >>> False
s1 = pd.Series([1,2,3,np.nan]) s1==s1 >>> 0 ? ? True ?? ?1 ? ? True ?? ?2 ? ? True ?? ?3 ? ?False ?? ?dtype: bool #獲取非缺失值 s1[s1==s1] >>> 0 ? ?1.0 ?? ?1 ? ?2.0 ?? ?2 ? ?3.0 ?? ?dtype: float64 #獲取非缺失值的數(shù)量 len(s1[s1==s1]) >>>3 #對缺失值進(jìn)行填補(bǔ)(除了fillna外的方式) s1[~(s1==s1)]=0 s1 >>> 0 ? ?1.0 ?? ?1 ? ?2.0 ?? ?2 ? ?3.0 ?? ?3 ? ?0.0 ?? ?dtype: float64
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python and、or以及and-or語法總結(jié)
這篇文章主要介紹了Python and、or以及and-or語法總結(jié),本文分別給出實例講解它們的使用方法,需要的朋友可以參考下2015-04-04