有时我们需要用一个序列去填充另一个序列的缺失值。比如处理周期性数据时,想要用周期的均值来填充缺失的数据,举例说明:
data = np.array([[1.15,2.31,3.14,4.27,2.09],[1.11,2.18,3.25,4.03,2.27],[1.20,np.nan,np.nan,4.41,2.11],[0.99,1.98,3,4.14,np.nan]])
data
Out[-]:
array([[1.15, 2.31, 3.14, 4.27, 2.09],
[1.11, 2.18, 3.25, 4.03, 2.27],
[1.2 , nan, nan, 4.41, 2.11],
[0.99, 1.98, 3. , 4.14, nan]])
在这个数组中,每行对应着一个周期,每个周期的数据都服从 [ 1. ? , 2. ? , 3. ? , 4. ? , 2. ? ] [1.?, 2.?, 3.?, 4.?, 2.?] [1.?,2.?,3.?,4.?,2.?]的规律,在填充数组中的缺失值时自然想到使用每列的均值。可使用np.nanmean()计算除去空值以外其他值的均值:
data_mean = np.nanmean(data,axis=0)
data_mean
Out[-]: array([1.1125 , 2.15666667, 3.13 , 4.2125 , 2.15666667])
用2.157和3.13填充data[2,1:2]位置的缺失值:
data[2,:][np.isnan(data[2,:])] = data_mean[np.isnan(data[2,:])]
data
Out[-]:
array([[1.15 , 2.31 , 3.14 , 4.27 , 2.09 ],
[1.11 , 2.18 , 3.25 , 4.03 , 2.27 ],
[1.2 , 2.15666667, 3.13 , 4.41 , 2.11 ],
[0.99 , 1.98 , 3. , 4.14 , nan]])
这行命令的意思是,首先先确定缺失值的位置,然后找到均值中对应位置的值,将它们按顺序赋给缺失值。
最后再把最后一个缺失值填充上,只需要改一下要填充的位置就好了:
data[3,:][np.isnan(data[3,:])] = data_mean[np.isnan(data[3,:])]
data
Out[-]:
array([[1.15 , 2.31 , 3.14 , 4.27 , 2.09 ],
[1.11 , 2.18 , 3.25 , 4.03 , 2.27 ],
[1.2 , 2.15666667, 3.13 , 4.41 , 2.11 ],
[0.99 , 1.98 , 3. , 4.14 , 2.15666667]])