Python 用列的平均值替换 NaN 值

pythonserver side programmingprogramming

在本文中,我们将看到用列的平均值替换 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("列平均值: ",col_means)
print("最终数组:\n", arr_filled)

输出

列平均值:
[2.5 5. 7.5]

最终数组:
[[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)
print("最终数组:\n", arr)

输出

列平均值:2.5
列平均值:5.0
列平均值:7.5

最终数组:
[[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("列平均值: ",col_means)
print("最终数组:\n", arr_filled)

输出

列平均值:[2.5 5. 7.5]
最终数组:
[[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("列平均值: ",col_means)
print("最终数组:\n", arr_filled)

输出

列平均值:[2.5 5. 7.5]
最终数组:
[[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("列均值: ",col_means)
print("最终数组:\n", arr)

输出

列均值:[2.5 5. 7.5]
最终数组:
[[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("列平均值: ",col_means)
print("最终数组:\n", arr)

输出

列平均值:[2.5 5. 7.5]
最终数组:
[[1. 2. 7.5]
[4. 5. 6. ]
[2.5 8. 9. ]]

解释

在上面的例子中,我们使用广播方法将 NaN 值替换为 NumPy 数组中的列平均值。在程序中,创建 mask 变量来标识 NaN 值,并将列平均值分配给数组中的所需位置。

因此,我们了解了不同的方法,可以使用这些方法将 NaN 值替换为 NumPy 数组中列的平均值。每种方法都为我们提供了替换 NaN 值的独特方法。您可以根据自己的需求和易用性选择任何方法。


相关文章