熱線電話:13121318867

登錄
首頁精彩閱讀數據探索之缺失值處理及代碼實現
數據探索之缺失值處理及代碼實現
2017-11-30
收藏

數據探索缺失值處理及代碼實現

數據挖掘中,前期數據預處理,會涉及到很多缺失值的處理問題。
現以python代碼實現為例,看如何具體處理的。
所需python
from pandas import Series, DataFrame
import pandas as pd
尋找缺失值

def FindFeactureNAorValue(data, feacture_cols, axis=0, value = 'NA', prob_dropFct = 0.95):
    '''
    函數說明:尋找每一個特征有多少value值,默認為:缺失值,及所占比率
    輸入:data——整個數據集,包括Index,target
        feacture_cols——特征
        prob_dropFct——大于這個比例,就丟掉該特征
    輸出:numValue——DataFrame  index='feacture1', columns=['numnumValue', 'probnumValue']
        dropFeacture_cols——要丟掉的特征列名
    '''
    #計算x中value值個數
    def num_Value(x, value = 'NA'):
        if value == 'NA':
            return sum(x.isnull())   #尋找缺失值個數
        else:
            return sum(x == value)  #尋找某個值value個數

    numValue = data[feacture_cols].apply(num_Value, axis=axis,args=[value])
    numValue = DataFrame(numValue, columns = ['numValue'])
    nExample = data.shape[0]
    probValue = map(lambda x: round(float(x)/nExample, 4), numValue['numValue'])
    numValue['probValue'] = probValue


    #尋找缺失值大于prob_dropFct的特征 m, , ,.
    dropFeacture = numValue[numValue['probValue'] >= prob_dropFct]
    dropFeacture_cols = list(dropFeacture.index)

    return numValue,dropFeacture_cols
處理數值型特征缺失值

def FillNAorValueOfNum(data, numFct_cols, value = 'NA', replaceNA = 'mean'):
    '''
    函數說明:為數值變量填上缺失值,缺失值特征均值,中位數,眾數
    輸入:data——整個數據集,包括Index,target
        numFct_cols——數值特征
        value ——'NA'或-1,-1也有可能為NA
        replaceNA——'mean'、'mode'、'median'
    輸出:newData——DataFrame 替換value值
    '''
    #用均值、眾數、中位數替換每一個特征缺失值或value值
    def fillValue(x, value=-1, replaceNA='mean'):
        if replaceNA == 'mean':
            replaceValue = x.mean()        
        if replaceNA == 'mode':
            x_mode = x.mode()
            if len(x_mode) > 1:
                replaceValue = x_mode[0]
            else:
                replaceValue = x_mode            
        if replaceNA == 'median':
            replaceValue = x.median()

        replaceValue = x.mean()

        x[x == value] = replaceValue
        return x

    numData = data[numFct_cols]
    if replaceNA == 'mean':
        if value == 'NA':
            newData = numData.fillna(numData.mean(),inplace=True)
        else:
            newData = numData.apply(fillValue, axis = 0, args=(value, replaceNA))

    if replaceNA == 'mode':
        if value == 'NA':
            newData = numData.fillna(numData.mode(),inplace=True)

        else:
            newData = numData.apply(fillValue, axis = 0, args=(value, replaceNA))                              

    if replaceNA == 'median':                     
        if value == 'NA':
            newData = numData.fillna(numData.median(),inplace=True)
        else:
            newData = numData.apply(fillValue, axis = 0, args=(value, replaceNA))

    return newData

處理類別型特征缺失值

from sklearn.preprocessing import LabelEncoder
def FillNAofCat(data, feacture_cols):
    '''
    函數說明:為類別變量填上缺失值,認為缺失值是新的一類
    輸入:data——整個數據集,包括Index,target
        feacture_cols——特征
    輸出:catData——DataFrame 數值化后的類別特征樣本
    '''
    catData = data[feacture_cols]
    catData = catData.fillna(value = -9999)

    #創建分類特征的標簽編碼器 jiushi字符串轉化為數字
    for var in feacture_cols:
        number = LabelEncoder()
        catData[var] = number.fit_transform(catData[var].astype('str'))

    return catData

def CatToDummy(data, catfct_cols):
    '''
    函數說明:類別變量轉化為啞變量
    輸入:data——整個數據集,包括Index,target
        catfct_cols——類別特征
    輸出:dummyCatData——DataFrame
    '''
    catData = data[catfct_cols]
    dummyCatData = pd.get_dummies(catData,columns=catfct_cols, sparse = True)

    return dummyCatData

為每個特征缺失值標上標志位

def GetNewValueOfNAfeacture(data, feacture_cols):
    '''
    函數說明:為有缺失值的變量創建一個新的變量 對缺失值標志為1,否則為0
    輸入:data——整個數據集,包括Index,target
        feacture_cols——特征
    輸出:newData——DataFrame類型
    '''
    newData = data[feacture_cols]
    for var in feacture_cols:   
        if newData[var].isnull().any() == True:
            newData[var+'_NA'] = newData[var].isnull()*1

    newData = newData.drop(feacture_cols,1)

    return newData

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码