Python 使用列平均值替换 NaN 值
在本文中,我们将了解如何用列的平均值替换 NaN(非数字)值。在数据分析中,处理 NaN 值是一个非常关键的步骤。因此,在这里您将学习各种方法,使用这些方法可以将 NaN(非数字)值替换为列的平均值。
方法 1:使用 Numpy.nanmean()。
示例
import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) arr_filled = np.where(np.isnan(arr), col_means, arr) print("Column mean: ",col_means) print("Final array: \n", arr_filled)
输出
Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]]
解释
在上面的示例中,我们使用 **numpy.nanmean()** 函数计算 NumPy 数组沿特定轴(此处 axis=0 表示列)的列平均值。为了识别数组中的 NaN 值,我们使用了 **numpy.isnan()** 函数,并使用 **numpy.where()** 将 NaN 值替换为列平均值。arr_filled 是替换 NaN 值为列平均值后的结果值。
方法 2:使用遍历和列平均值。
示例
import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) for i in range(arr.shape[1]): column = arr[:, i] column_mean = np.nanmean(column) column[np.isnan(column)] = column_mean print("Column mean: ",column_mean) print("Final array: \n", arr)
输出
Column mean: 2.5 Column mean: 5.0 Column mean: 7.5 Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]]
解释
在上面的示例中,我们使用循环遍历了 NumPy 数组中的每一列。对于每一列,我们使用该列计算列平均值。我们将 column_mean 的值分配给 column[np.isnan(column)]。
方法 3:使用 Numpy.nan_to_num() 和 Numpy.mean()。
示例
import pandas as pd import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) arr_filled = np.nan_to_num(arr, nan=col_means) print("Column mean: ",col_means) print("Final array: \n", arr_filled)
输出
Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]]
解释
在上面的示例中,我们使用了 **numpy.nan_to_num()** 方法,该方法用于将 NaN 值替换为任何值,方法是将我们想要替换的列平均值作为值传递。在 **arr_filled** 结果中,替换后的列值将位于 NaN 的位置。
方法 4:Numpy.apply_along_axis() 和列平均值。
示例
import pandas as pd import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) def replace_nan(column): column[np.isnan(column)] = np.nanmean(column) return column arr_filled = np.apply_along_axis(replace_nan, axis=0, arr=arr) print("Column mean: ",col_means) print("Final array: \n", arr_filled)
输出
Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]]
解释
在上面的示例中,我们使用了 **numpy.apply_along_axis()** 方法将 **replace_nan()** 函数应用于 NumPy 数组的每一列,并指定轴(此处 axis=0 表示列)。此处的 **replace_nan()** 函数将每一列中的 NaN 值替换为列平均值。
方法 5:Numpy.nanmean() 和花式索引。
示例
import pandas as pd import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) mask = np.isnan(arr) arr[mask] = col_means[np.newaxis, :].repeat(arr.shape[0], axis=0)[mask] print("Column mean: ",col_means) print("Final array: \n", arr)
输出
Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]]
解释
在上面的示例中,我们使用了 numpy.repeat() 函数重复列平均值与 NumPy 行数组,以匹配原始数组的形状。然后,我们使用花式索引将数组中的 NaN 值替换为列平均值。此过程不需要额外的空间,因为它在原地执行修改。
方法 6:Numpy.nanmean() 和广播。
示例
import pandas as pd import numpy as np arr = np.array([[1, 2, np.nan], [4, np.nan, 6], [np.nan, 8, 9]]) col_means = np.nanmean(arr, axis=0) mask = np.isnan(arr) arr[mask] = col_means print("Column mean: ",col_means) print("Final array: \n", arr)
输出
Column mean: [2.5 5. 7.5] Final array: [[1. 2. 7.5] [4. 5. 6. ] [2.5 8. 9. ]]
解释
在上面的示例中,我们使用了广播方法将 NumPy 数组中的 NaN 值替换为列平均值。在程序中,创建了 **mask** 变量来识别 NaN 值,并将列平均值分配给数组中的所需位置。
因此,我们了解了不同的方法,可以使用这些方法将 NumPy 数组中 NaN 值替换为列的平均值。每种方法都为我们提供了替换 NaN 值的独特方法。您可以根据您的需求和易用性选择任何方法。