NumPy - 处理缺失数据
处理数组中的缺失数据
处理缺失数据是数据分析和处理中的常见挑战。数组中缺失数据的原因多种多样,例如数据收集不完整、数据录入错误或故意遗漏。
在 NumPy 和数据分析中,处理缺失值涉及识别、处理和有效地处理它们,以确保数据完整性和准确的结果。
识别缺失数据
要处理缺失数据,第一步就是识别它。在 NumPy 中,缺失值通常在浮点数组中表示为 np.nan。您可以使用特定函数(例如 np.isnan())来检测这些缺失值。
示例
在下面的示例中,我们创建一个数组,其中包含由 np.nan 表示的缺失值。然后,我们使用 np.isnan() 函数创建一个掩码来识别这些缺失值 -
import numpy as np # 创建一个包含缺失值的数组 arr = np.array([1, 2, np.nan, 4, np.nan, 6]) # 检查缺失值 is_nan = np.isnan(arr) print("包含缺失值的数组: ", arr) print("缺失值掩码: ", is_nan)
以下是得到的输出 -
包含缺失值的数组: [ 1. 2. nan 4. nan 6.] 缺失值掩码: [False False True False True False]
移除缺失数据
移除缺失数据是指剔除数据集中缺失数据的部分。
在 NumPy 中,您可以使用布尔索引从数组中排除 NaN 值。例如,创建一个用于识别缺失值的掩码,然后使用它来过滤掉这些值。
示例
在此示例中,我们从一个包含缺失值的数组开始,该数组由"np.nan"表示。然后,我们使用布尔索引删除这些缺失值,并使用 np.isnan() 函数过滤掉 np.nan 条目 -
import numpy as np # 创建一个包含缺失值的数组 arr = np.array([1, 2, np.nan, 4, np.nan, 6]) # 删除缺失值 cleaned_arr = arr[~np.isnan(arr)] print("原始数组: ", arr) print("删除缺失值的数组: ", cleaned_arr)
这将产生以下结果 -
原始数组: [ 1. 2. nan 4. nan 6.] 删除缺失值的数组: [1. 2. 4. 6.]
替换缺失数据
替换缺失数据意味着用替代值填充数据缺失的部分。在 NumPy 中,你可以使用 np.nan_to_num() 函数将 NaN 值替换为特定数字,例如零或其他值的平均值。语法如下:
numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)
其中,
- x: 包含 NaN 值、无穷大或其他数值的输入数组。
- copy: 布尔值,指示是否复制数组(默认为 True)。如果为 False,则操作可以就地执行。
- nan: 用于替换 NaN 值的值。默认值为 0.0。
- posinf: 用于替换正无穷大 (inf) 的值。如果未指定,则默认为一个非常大的数字。
- neginf: 用于替换负无穷大 (-inf) 的值。如果未指定,则默认为一个非常小的数(负数)。
示例
在下面的示例中,我们创建一个包含缺失值的数组,用"np.nan"表示。然后,我们使用 np.nan_to_num() 函数将这些缺失值替换为零,该函数会用指定的值填充 np.nan 中的条目 -
import numpy as np # 创建一个包含缺失值的数组 arr = np.array([1, 2, np.nan, 4, np.nan, 6]) # 将缺失值替换为零 filled_arr = np.nan_to_num(arr, nan=0) print("原始数组: ", arr) print("替换缺失值的数组: ", filled_arr)
以下是上述代码的输出 -
原始数组: [ 1. 2. nan 4. nan 6.] 替换缺失值的数组: [1. 2. 0. 4. 0. 6.]
插入缺失数据
插入缺失数据涉及根据周围数据估算并填充数据集中的缺失值。
插值不是用平均值之类的常数替换缺失值,而是通过分析数据中的趋势或模式来预测缺失值。
例如,如果"4"和"8"之间有一个缺失值,插值可能会将其估算为"6"。
示例
在下面的示例中,我们使用 SciPy 中的"interp1d"函数应用线性插值来处理包含缺失值的数组 (np.nan)。此函数根据非缺失数据估计并填充缺失值,从而生成一个完整的数组 -
import numpy as np from scipy.interpolate import interp1d # 创建一个包含缺失值的数组 arr = np.array([1, 2, np.nan, 4, np.nan, 6]) # 创建一个索引数组 indices = np.arange(len(arr)) # 为非缺失值创建掩码 mask = ~np.isnan(arr) # 执行线性插值 interp_func = interp1d(indices[mask], arr[mask], kind='linear', fill_value='extrapolate') filled_arr = interp_func(indices) print("原始数组: ", arr) print("包含插值缺失值的数组: ", filled_arr)
输出结果如下 -
原始数组: [ 1. 2. nan 4. nan 6.] 包含插值缺失值的数组: [1. 2. 3. 4. 5. 6.]