NumPy - 处理缺失数据



处理数组中的缺失数据

处理缺失数据是数据分析和处理中常见的一个挑战。数组中的缺失数据可能由于各种原因而产生,例如数据收集不完整、数据输入错误或故意省略。

在 NumPy 和数据分析中,处理缺失值涉及有效地识别、处理和处理它们,以确保数据完整性和准确的结果。

识别缺失数据

为了处理缺失数据,第一步是识别它。在 NumPy 中,缺失值通常在浮点数组中表示为 np.nan。您可以使用特定的函数,例如 **np.isnan()** 来检测这些缺失值。

示例

在下面的示例中,我们创建了一个包含由 **np.nan** 表示的缺失值的数组。然后,我们使用 np.isnan() 函数创建一个掩码来识别这些缺失值 -

import numpy as np

# Creating an array with missing values
arr = np.array([1, 2, np.nan, 4, np.nan, 6])

# Checking for missing values
is_nan = np.isnan(arr)

print("Array with Missing Values:\n", arr)
print("Missing Value Mask:\n", is_nan)

以下是获得的输出 -

Array with Missing Values:
[ 1.  2. nan  4. nan  6.]
Missing Value Mask:
[False False  True False  True False]

删除缺失数据

删除缺失数据涉及消除数据集中数据缺失的部分。

在 NumPy 中,您可以使用 **布尔索引** 从数组中排除 **NaN** 值。例如,创建一个识别缺失值的掩码,然后使用它来过滤掉这些值。

示例

在这个例子中,我们从一个包含由“np.nan”表示的缺失值的数组开始。然后,我们使用布尔索引删除这些缺失值,使用 np.isnan() 函数过滤掉 np.nan 条目 -

import numpy as np

# Creating an array with missing values
arr = np.array([1, 2, np.nan, 4, np.nan, 6])

# Removing missing values
cleaned_arr = arr[~np.isnan(arr)]

print("Original Array:\n", arr)
print("Array with Missing Values Removed:\n", cleaned_arr)

这将产生以下结果 -

Original Array:
[ 1.  2. nan  4. nan  6.]
Array with Missing Values Removed:
[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

# Creating an array with missing values
arr = np.array([1, 2, np.nan, 4, np.nan, 6])

# Replacing missing values with zero
filled_arr = np.nan_to_num(arr, nan=0)

print("Original Array:\n", arr)
print("Array with Missing Values Replaced:\n", filled_arr)

以下是上述代码的输出 -

Original Array:
[ 1.  2. nan  4. nan  6.]
Array with Missing Values Replaced:
[1. 2. 0. 4. 0. 6.]

插值缺失数据

插值缺失数据涉及根据周围数据估计和填充数据集中缺失的值。

插值不是用像平均值这样的常数替换缺失值,而是通过分析数据中的趋势或模式来预测缺失值应该是什么。

例如,如果“4”和“8”之间缺少一个值,则插值可能会将其估计为“6”。

示例

在下面的示例中,我们通过使用 SciPy 中的“interp1d”应用线性插值来处理包含缺失值 (np.nan) 的数组。此函数根据非缺失数据估计和填充缺失值,从而产生一个完整的数组 -

import numpy as np
from scipy.interpolate import interp1d

# Creating an array with missing values
arr = np.array([1, 2, np.nan, 4, np.nan, 6])

# Creating an index array
indices = np.arange(len(arr))

# Creating a mask for non-missing values
mask = ~np.isnan(arr)

# Performing linear interpolation
interp_func = interp1d(indices[mask], arr[mask], kind='linear', fill_value='extrapolate')
filled_arr = interp_func(indices)

print("Original Array:\n", arr)
print("Array with Interpolated Missing Values:\n", filled_arr)

获得的输出如下所示 -

Original Array:
 [ 1.  2. nan  4. nan  6.]
Array with Interpolated Missing Values:
 [1. 2. 3. 4. 5. 6.]
广告