python对数组缺失值进行填充

时间:2022-02-03 21:08:21

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    #最后返回用平均值填充空缺值后的数组