NumPy - 移除缺失数据
从数组中移除缺失数据
从数组中移除缺失数据需要清理数据集,方法是删除包含 NaN 或其他缺失值指示的条目。
NaN 用于表示未定义或无法表示的值。在执行任何计算之前,务必处理 NaN 值,以避免产生误导性结果或错误。
从一维数组中移除缺失数据
从一维数组中移除缺失数据需要过滤掉标记为缺失的元素,这些元素通常用 NaN(非数字)表示。在一维数组中,使用 np.isnan() 函数识别缺失值,该函数会创建一个布尔数组,其中每个"True"值对应原始数组中的一个"NaN"项。
要移除这些缺失值,可以将这个布尔掩码应用于数组,并反转掩码以聚焦非 NaN 项。具体来说,~np.isnan() 会生成一个布尔数组,其中 True 表示有效数据。
通过使用此掩码对原始数组进行索引,可以过滤掉所有 NaN 值,从而生成一个仅包含有效项的干净数组。
示例
在下面的示例中,我们使用布尔索引和 np.isnan() 函数来创建一个用于识别 NaN 值的掩码。然后,我们应用此掩码从原始数组中删除 NaN 值 -
import numpy as np # 创建一个包含 NaN 值的一维数组 arr = np.array([1.0, 2.5, np.nan, 4.7, np.nan, 6.2]) # 使用布尔索引删除 NaN 值 cleaned_arr = arr[~np.isnan(arr)] print("原始数组: ", arr) print("清理后的数组(不含 NaN): ", cleaned_arr)
以下是得到的输出 -
原始数组: [1. 2.5 nan 4.7 nan 6.2] 清理后的数组(不含 NaN): [1. 2.5 4.7 6.2]
从二维数组中删除缺失数据
从二维数组中删除缺失数据涉及删除包含 NaN(非数字)值的行或列。
此过程可确保数据集已清理并适合分析或建模。根据具体需求,您可以选择删除存在缺失值的整行或整列。
示例
在此示例中,我们使用 np.isnan() 函数与 any() 函数结合使用来创建一个掩码,用于识别包含 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, 9.4]]) # 删除包含 NaN 值的行 cleaned_arr_2d = arr_2d[~np.isnan(arr_2d).any(axis=1)] print("原始二维数组: ", arr_2d) print("清理后的二维数组(不含 NaN 的行): ", cleaned_arr_2d)
这将产生以下结果 −
原始二维数组: [[1. nan 3.5] [nan 5.1 6.3] [7.2 8.1 9.4]] 清理后的二维数组(行不包含 NaN): [[7.2 8.1 9.4]]
删除包含缺失数据的列
删除包含缺失数据的列是指从二维数组或数据集中删除所有标记为缺失的元素(通常用 NaN(非数字)表示)的列。
这是一个常见的数据清理步骤,用于确保数据集仅包含包含完整数据的列,从而提高后续分析的质量。
示例
在下面的示例中,我们创建一个包含一些 NaN 值的二维数组,并使用 np.isnan() 函数结合 any() 函数删除包含任何 NaN 值的列。这将识别包含 NaN 值的列,然后过滤数组以排除这些列 -
import numpy as np # 创建一个包含一些 NaN 值的二维数组 arr_2d = np.array([[1.0, np.nan, 3.0], [4.0, 5.0, 6.0], [np.nan, 8.0, 9.0]]) # 删除包含任何 NaN 值的列 cleaned_arr_2d_cols = arr_2d[:, ~np.isnan(arr_2d).any(axis=0)] print("原始二维数组:") print(arr_2d) print("删除包含 NaN 值的列后的二维数组:") print(cleaned_arr_2d_cols)
以下是上述代码的输出 -
原始二维数组: [[ 1. nan 3.] [ 4. 5. 6.] [nan 8. 9.]] 删除包含 NaN 值的列后的二维数组: [[3.] [6.] [9.]]
从多维数组中删除缺失数据
从多维数组中删除缺失数据数组的处理过程类似于一维和二维数组,但应用于更高维度。
多维数组(例如,三维或四维数组)会带来额外的复杂性,因为缺失值可能出现在多个维度上。目标是过滤掉数组中包含缺失数据的切片或特定部分。
示例
在以下示例中,我们将创建一个包含一些 NaN 值的三维数组,并删除包含任何 NaN 值的切片(二维数组)。我们使用 np.isnan() 函数结合 any() 函数来识别包含 NaN 值的切片,然后从数组中过滤掉这些切片 -
import numpy as np # 创建包含 NaN 值的三维数组 arr_3d = np.array([[[1.0, np.nan], [3.5, 4.2]], [[np.nan, 6.3], [7.2, 8.1]]]) # 删除包含 NaN 值的切片 cleaned_arr_3d = arr_3d[~np.isnan(arr_3d).any(axis=(1, 2))] print("原始三维数组: ", arr_3d) print("清理后的三维数组(不含 NaN 的切片): ", cleaned_arr_3d)
输出结果如下 −
原始三维数组: [[[1. nan] [3.5 4.2]] [[nan 6.3] [7.2 8.1]]] 清理后的三维数组(不含 NaN 的切片): []
从结构化数组中移除缺失值
在 NumPy 中,从结构化数组中移除缺失值需要处理具有复杂数据类型的数组,其中每个元素都是一条记录或包含多个字段的行。
结构化数组的特定字段中可能包含缺失值(NaN 或其他占位符)。目标是过滤掉包含缺失值的记录,确保只保留完整的数据。
示例
在下面的示例中,我们定义了一个包含字段"name"和"age"的结构化数组,并使用"f4"(float32)作为"age"字段以容纳 NaN 值。然后,我们创建一个布尔掩码来识别并删除"age"字段中缺失值的记录 -
import numpy as np # 定义一个包含"name"和"age"字段的结构化数组 # 使用"f4"(float32)作为"age"字段来处理 NaN 值 dtype = [('name', 'U10'), ('age', 'f4')] data = [('Alice', 25.0), ('Bob', np.nan), ('Charlie', 30.0)] structured_array = np.array(data, dtype=dtype) # 识别"age"字段中的缺失值 nan_mask = np.isnan(structured_array['age']) # 删除"age"字段中缺失值的记录'age' 字段 cleaned_structured_array =structured_array[~nan_mask] print("原始结构化数组:") print(structured_array) print("删除缺失值后的结构化数组:") print(cleaned_structured_array)
执行上述代码后,我们得到以下输出 -
原始结构化数组: [('Alice', 25.) ('Bob', nan) ('Charlie', 30.)] 删除缺失值后的结构化数组: [('Alice', 25.) ('Charlie', 30.)]