NumPy - 缺失数据填充
数组中缺失数据填充
数组中缺失数据填充是指根据现有数据,用估算值或计算值填充缺失值。此过程有以下作用:
- 保留数据:避免丢失对分析可能重要的信息。
- 改进分析:确保数据集完整,从而提高分析准确性。
- 处理缺失数据:解决数据中的缺失问题,如果处理不当,这些缺失问题可能会导致结果失真。
用均值填充缺失数据
用均值填充缺失数据是一种用现有数据的均值填充数据集中缺失值的技术。平均值,通常称为平均值,是一种集中趋势的度量,它通过找到一组数字的中心值来概括它们。
它的计算方法是将数据集中的所有数字相加,然后将和除以这些数字的数量。
示例
在下面的示例中,我们计算数组中非 NaN 值的平均值,然后使用该平均值替换 NaN 值 -
import numpy as np # 创建一个包含 NaN 值的数组 arr = np.array([1.0, 2.5, np.nan, 4.7, np.nan, 6.2]) # 计算非 NaN 值的平均值 mean_value = np.nanmean(arr) # 使用平均值插补 NaN 值 imputed_arr = np.where(np.isnan(arr), mean_value, arr) print("原始数组: ", arr) print("平均值:", mean_value) print("插补数组: ", imputed_arr)
以下是获得的输出 -
原始数组:[1. 2.5 nan 4.7 nan 6.2] 平均值:3.5999999999999996 插补数组:[1.2.5 3.6 4.7 3.6 6.2]
用中位数填补缺失数据
用中位数填补缺失数据是一种用现有数据的中位数填充数据集中缺失值的技术。
中位数是数据集按顺序排列时的中间值;如果数据集的观测值数量为偶数,则中位数是两个中间值的平均值。
示例
在此示例中,我们计算数组中非 NaN 值的中位数,然后使用该中位数替换 NaN 值 -
import numpy as np # 创建包含 NaN 值的数组 arr = np.array([1.0, 2.5, np.nan, 4.7, np.nan, 6.2]) # 计算非 NaN 值的中位数 median_value = np.nanmedian(arr) # 使用中位数插补 NaN 值 imputed_arr = np.where(np.isnan(arr), median_value, arr) print("原始数组: ", arr) print("中位数:", median_value) print("插补数组: ", imputed_arr)
这将产生以下结果 -
原始数组:[1. 2.5 nan 4.7 nan 6.2] 中位数:3.6 插补数组:[1.2.5 3.6 4.7 3.6 6.2]
使用常量填充缺失数据
使用常量填充缺失数据是一种用预定义的常量值替换数据集中缺失值的技术。
常量值是指在特定上下文或操作过程中保持不变的固定、不变的数字或值。
示例
在下面的示例中,我们定义了一个用于填充的常量值,并用该常量替换数组中的 NaN 值 -
import numpy as np # 创建包含 NaN 值的数组 arr = np.array([1.0, 2.5, np.nan, 4.7, np.nan, 6.2]) # 定义用于插补的常量值 constant_value = 0 # 使用常量插补 NaN 值 imputed_arr = np.where(np.isnan(arr), Constant_value, ARR) print("原始数组: ", ARR) print("常量值:", Constant_value) print("插补后的数组: ", Imputed_arr)
以下是上述代码的输出 -
原始数组:[1. 2.5 nan 4.7 nan 6.2] 常量值:0 插补后的数组:[1.2.5 0. 4.7 0. 6.2]
在多维数组中填充缺失数据
在多维数组中填充缺失数据涉及填充多维数组(例如二维矩阵或高维数组)中的缺失值。
示例:在二维数组中填充缺失数据
在以下示例中,我们计算二维数组中每列的平均值,同时忽略 NaN 值。然后将 NaN 值替换为其各自列的平均值 -
import numpy as np # 创建包含 NaN 值的二维数组 arr_2d = np.array([[1.0, np.nan, 3.5], [np.nan, 5.1, 6.3], [7.2, 8.1, np.nan]]) # 将 NaN 值替换为每列的平均值 column_means = np.nanmean(arr_2d, axis=0) inds = np.where(np.isnan(arr_2d)) # 将 NaN 值替换为相应列的平均值 arr_2d[inds] = np.take(column_means, inds[1]) print("原始二维数组: ", arr_2d) print("列平均值:", column_means) print("插补后的二维数组: ", arr_2d)
输出结果如下 −
原始二维数组: [[1. 6.6 3.5] [4.1 5.1 6.3] [7.2 8.1 4.9]] 列平均值:[4.1 6.6 4.9] 插补后的二维数组: [[1. 6.6 3.5] [4.1 5.1 6.3] [7.2 8.1 4.9]]
示例:在三维数组中插补缺失数据
这里,我们计算三维数组所有切片中每列的中值,同时忽略 NaN。然后将 NaN 值替换为每列对应的中值 -
import numpy as np # 创建一个包含一些 NaN 值的三维数组 arr_3d = np.array([[[1.0, 2.0, np.nan], [np.nan, 5.0, 6.0], [7.0, np.nan, 9.0]], [[np.nan, 2.0, 3.0], [4.0, np.nan, np.nan], [7.0, 8.0, np.nan]]]) # 计算沿最后一个轴的每个切片的中值,忽略 NaN 值 median_value = np.nanmedian(arr_3d, axis=(0, 1)) # 查找存在 NaN 值的索引 nan_indices = np.isnan(arr_3d) # 将 NaN 值替换为相应切片的中值 for i in range(arr_3d.shape[2]): # 遍历第三个维度 arr_3d[:, :, i][nan_indices[:, :, i]] = median_value[i] print("中位数插补后的三维数组:") print(arr_3d)
执行上述代码后,我们得到以下输出 -
中位数插补后的三维数组: [[[1. 2. 6. ] [5.5 5. 6. ] [7. 3.5 9. ]] [[5.5 2. 3. ] [4. 3.5 6. ] [7. 8. 6. ]]]
使用线性插值进行缺失数据插值
使用线性插值对缺失数据进行插值,是指根据缺失值周围的值来估计缺失值。此技术适用于序列或空间数据,因为缺失值可以通过其前后值推断出来。
- 线性插值是一种估计介于已知值之间的未知值的方法。
- 对于一维数据,它涉及在两个已知点之间绘制一条直线,并利用这条直线估计中间点的值。
- 对于多维数据,线性插值可以将这一概念扩展到更高维度。
示例
在下面的示例中,我们使用线性插值来填充一维数组中的缺失值 (NaN)。我们通过根据周围的非 NaN 值估算 NaN 值来实现这一点 -
import numpy as np from scipy import interpolate # 创建一个包含 NaN 值的数组 arr = np.array([1.0, np.nan, 3.5, np.nan, 5.0]) # 插入缺失值 nans, x = np.isnan(arr), lambda z: z.nonzero()[0] arr[nans] = np.interp(x(nans), x(~nans), arr[~nans]) print("原始数组: ", arr) print("包含插值值的数组: ", arr)
我们得到如下所示的输出 -
原始数组: [1. 2.25 3.5 4.25 5. ] 包含插值后的数组: [1. 2.25 3.5 4.25 5. ]