python對數組缺失值進行填充


1. 兩個常用的函數

1.1 np.nonzero()

np.nonzero()函數返回數組中不為False(0)的元素對應的索引

a = np.array([1,2,0,3,1,0])
print(np.nonzero(a))

>>(array([0, 1, 3, 4], dtype=int64),)
#返回數組中不為0元素的索引數組
a = np.array([1,2,0,3,1,0])
print(np.nonzero(a)[0])

>>[0 1 3 4 5 7]
#這里要注意使用的時候如果只需要索引數組,需要在后面加上[0],這樣就只是返回索引數組
#可以和上面對比來看

1.2 np.isnan()

np.isnan()函數判斷一個數組各個元素是否為nan,並返回相同維度對應的bool數組

a = np.array([1,2,0,np.nan,3,1,0,np.nan])
print(np.isnan(a))

>>[False False False  True False False False  True]
#返回對數組進行空值檢測的結果

類似的還有np.~isnan()函數,顧名思義就是實值檢測,對於非nan元素返回true,nan元素返回false,與isnan()函數剛好相反

2. 實現一個缺失值填充函數

在函數中我們通過上述函數實現計算同一特征非空數據的均值,並以此填充哪些空缺值

# 加載包含NaN的數據集
# 用平均值代替缺失值
def replaceNaNWithMean():
    #載入數據
    datMat=loadDataSet('secom.data',' ')
   #獲取特征維度     
    numFeat = shape(datMat)[1]
    #遍歷數據集每一個維度
    for i in range(numFeat):
        #利用該維度所有非NaN特征求取均值
        #nonzero返回非空元素的索引
        #isnan和~isnan返回數組元素是否對應為空的True or False數組
        meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i])
        #將該維度中所有NaN特征全部用均值替換
        #.A將matrix轉化為ndarray,然后~isnan()獲得對應bool數組
        #再通過nonzero()得到所有不為nan數據的索引數組
        #也即第i個特征不為nan的所有元素的索引,最后通過mean對這些元素求出平均值
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal
        #最后再用計算出來的平均值填充空值
    return datMat    #最后返回用平均值填充空缺值后的數組

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM