Python異常值處理與檢測

缺失值處理

pandas判斷缺失值一般采用 isnull(),然而生成所有數(shù)據(jù)的true、false矩陣赁酝,對于龐大的數(shù)據(jù)很難一眼看出缺失數(shù)據(jù)的位置捆毫。

缺失值查看

測試數(shù)據(jù)采用了隨機(jī)生成。

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.random.randn(10,6))
>>> #生成區(qū)域隨機(jī)數(shù)
>>> df.iloc[1:3,1] = np.nan
>>> df.iloc[5,3] = np.nan
>>> df.iloc[7:9,5] = np.nan
>>> df
          0         1         2         3         4         5
0 -0.524651 -0.306484  0.921319 -1.752106 -0.593152 -0.109011
1  0.350563       NaN -0.511227 -0.893392 -0.362926 -0.567714
2 -0.696586       NaN -0.387368  0.431769  0.015262 -1.002748
3  0.029329  0.645159  0.880687  0.002313  0.000143  0.410978
4  1.086453 -0.183210  0.465487  0.204141 -0.827070 -0.227329
5  0.449833  0.870347 -0.285700       NaN -0.116068 -0.061469
6  0.054838 -0.000641 -2.127298 -0.375447  0.463457  0.263546
7  2.932326 -2.227659 -0.559444  0.080580  1.731467       NaN
8  1.417988  0.083318 -0.041332  1.350390 -1.236223       NaN
9 -1.549584  0.156260  0.846521 -0.087683 -0.171236  0.334471
  • 判斷數(shù)據(jù)是否存在缺失值:isnull()
>>> #判斷是否存在缺失值(矩陣中True表示此位置為缺失值疾呻、False表示非缺失值)
>>> df.isnull()
       0      1      2      3      4      5
0  False  False  False  False  False  False
1  False   True  False  False  False  False
2  False   True  False  False  False  False
3  False  False  False  False  False  False
4  False  False  False  False  False  False
5  False  False  False   True  False  False
6  False  False  False  False  False  False
7  False  False  False  False  False   True
8  False  False  False  False  False   True
9  False  False  False  False  False  False
  • 判斷哪些”列”存在缺失值:isnull().any()
>>> df.isnull().any()
0    False
1     True
2    False
3     True
4    False
5     True
dtype: bool

由此可以看出,第1、3淌哟、5列存在缺失值

  • 只顯示存在缺失值行的數(shù)據(jù)
>>> df[df.isnull().values==True]
          0         1         2         3         4         5
1  0.350563       NaN -0.511227 -0.893392 -0.362926 -0.567714
2 -0.696586       NaN -0.387368  0.431769  0.015262 -1.002748
5  0.449833  0.870347 -0.285700       NaN -0.116068 -0.061469
7  2.932326 -2.227659 -0.559444  0.080580  1.731467       NaN
8  1.417988  0.083318 -0.041332  1.350390 -1.236223       NaN

只顯示存在缺失值的行列,清楚的確定缺失值的位置辽故。

缺失數(shù)據(jù)處理

對于缺失數(shù)據(jù)一般處理方法為濾掉或者填充.

  • 濾除缺失數(shù)據(jù):dropna()
>>> df.dropna()
          0         1         2         3         4         5
0 -0.524651 -0.306484  0.921319 -1.752106 -0.593152 -0.109011
3  0.029329  0.645159  0.880687  0.002313  0.000143  0.410978
4  1.086453 -0.183210  0.465487  0.204141 -0.827070 -0.227329
6  0.054838 -0.000641 -2.127298 -0.375447  0.463457  0.263546
9 -1.549584  0.156260  0.846521 -0.087683 -0.171236  0.334471

以上只顯示了非缺失數(shù)據(jù)徒仓。

當(dāng)只選擇行里的數(shù)據(jù)全部為空時(shí)才丟棄時(shí),可向dropna()傳入?yún)?shù)how='all'誊垢,如果想以同樣的方式按列丟棄掉弛,可以傳入axis=1;

  • 填充缺失數(shù)據(jù):fillna()

如果不想丟掉缺失的數(shù)據(jù)而是想用默認(rèn)值填充這些缺失值喂走,可以使用fillna()函數(shù)殃饿,如果不想只以某個(gè)標(biāo)量填充,可以傳入一個(gè)字典如(fillna({}))芋肠,對不同的列填充不同的值壁晒,

  • 缺失值較多的特征處理
# 定義工資改變特征缺失值處理函數(shù),將有變化設(shè)為Yes,缺失設(shè)為No 
def set_salary_change(df):
    df.loc[(df.salary_change.notnull()), 'salary_change'] = 'Yes'
    df.loc[(df.salary_change.isnull(df)), 'salary_change'] = 'No'
    print df 
    pd.df()print df
    return df
data_train = set_salary_change(df)
  • 缺失值較少的特征處理

把NaN直接作為一個(gè)特征秒咐,假設(shè)用0表示谬晕,實(shí)現(xiàn)如下:

df.fillna(0) 

用均值填充

# 將所有行用各自的均值填充 
data_train.fillna(data_train.mean())  
# 也可以指定某些行進(jìn)行填充
data_train.fillna(data_train.mean()['browse_his', 'card_num']) 

用上下數(shù)據(jù)進(jìn)行填充

# 用前一個(gè)數(shù)據(jù)代替NaN:method='pad'
data_train.fillna(method='pad')  
# 與pad相反,bfill表示用后一個(gè)數(shù)據(jù)代替NaN 
data_train.fillna(method='bfill')

用插值法填充

# 插值法就是通過兩點(diǎn)(x0携取,y0)攒钳,(x1,y1)估計(jì)中間點(diǎn)的值 
data_train.interpolate()

用算法擬合進(jìn)行填充

# 定義browse_his缺失值預(yù)測填充函數(shù)
def set_missing_browse_his(df):
    # 把已有的數(shù)值型特征取出來輸入到RandomForestRegressor中
    process_df = df[['browse_his', 'gender', 'job', 'edu', 'marriage', 'family_type']]
    # 乘客分成已知該特征和未知該特征兩部分
    known = process_df[process_df.browse_his.notnull()].as_matrix()
    unknown = process_df[process_df.browse_his.isnull()].as_matrix()
    # X為特征屬性值
    X = known[:, 1:]
    # y為結(jié)果標(biāo)簽值
    y = known[:, 0]
    # fit到RandomForestRegressor之中
    rfr = RandomForestRegressor(random_state=0, n_estimators=2000,  n_jobs=-1)
    rfr.fit(X,y)
    # 用得到的模型進(jìn)行未知特征值預(yù)測
    predicted = rfr.predict(unknown[:, 1::])
    # 用得到的預(yù)測結(jié)果填補(bǔ)原缺失數(shù)據(jù)
    df.loc[(df.browse_his.isnull()), 'browse_his'] = predicted
    return df, rfr
    
data_train, rfr = set_missing_browse_his(data_train) 

當(dāng)然雷滋,針對我們這里的數(shù)據(jù)不撑,我們對那些缺失值不是很大的特征都采用方式5來填補(bǔ)其缺失值。即使用隨機(jī)森林算法晤斩,利用數(shù)據(jù)表中某些沒有缺失的特征屬性來預(yù)測某特征屬性的缺失值焕檬。將填補(bǔ)后的數(shù)據(jù)表保存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澳泵,一起剝皮案震驚了整個(gè)濱河市实愚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兔辅,老刑警劉巖腊敲,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異维苔,居然都是意外死亡碰辅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門介时,熙熙樓的掌柜王于貴愁眉苦臉地迎上來没宾,“玉大人,你說我怎么就攤上這事沸柔¢藕穑” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵勉失,是天一觀的道長羹蚣。 經(jīng)常有香客問我,道長乱凿,這世上最難降的妖魔是什么顽素? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮徒蟆,結(jié)果婚禮上胁出,老公的妹妹穿的比我還像新娘。我一直安慰自己段审,他們只是感情好全蝶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般抑淫。 火紅的嫁衣襯著肌膚如雪绷落。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天始苇,我揣著相機(jī)與錄音砌烁,去河邊找鬼。 笑死催式,一個(gè)胖子當(dāng)著我的面吹牛函喉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荣月,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼管呵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哺窄?” 一聲冷哼從身側(cè)響起捐下,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堂氯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牌废,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咽白,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸟缕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晶框。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖懂从,靈堂內(nèi)的尸體忽然破棺而出授段,到底是詐尸還是另有隱情,我是刑警寧澤番甩,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布侵贵,位于F島的核電站,受9級(jí)特大地震影響缘薛,放射性物質(zhì)發(fā)生泄漏窍育。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一宴胧、第九天 我趴在偏房一處隱蔽的房頂上張望漱抓。 院中可真熱鬧,春花似錦恕齐、人聲如沸乞娄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仪或。三九已至确镊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溶其,已是汗流浹背骚腥。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓶逃,地道東北人束铭。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像厢绝,于是被迫代替她去往敵國和親契沫。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容