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