将NumPy数组ndarray的缺失值NaN(例如np.nan)的元素替换为其他值时,可是使用np.nan_to_num()和np.isnan()布尔值索引的方法。可以将其替换为任意值,或替换为不包含缺失值NaN的元素的平均值。
在此,将对以下进行说明内容。
当使用np.genfromtxt()读取CSV文件时,默认情况下,缺失部分变为缺失值NaN(非数字)。使用print()打印时,显示nan。
import numpy as np
a = np.genfromtxt('./data/12/sample_nan.csv', delimiter=',')
print(a)
# [[11. 12. nan 14.]
# [21. nan nan 24.]
# [31. 32. 33. 34.]]
使用np.nan或float(‘nan’)显式生成缺少的NaN。此外,可以导入标准库中的math模块并将其用作math.nan。结果都一样。
a_nan = np.array([0, 1, np.nan, float('nan')])
print(a_nan)
# [ 0. 1. nan nan]
用"=="不能进行是否为缺失值(nan)的判定,所以请使用np.isnan()或math.isnan()来判定是否为缺少值(nan)。
print(np.nan == np.nan)
# False
print(np.isnan(np.nan))
# True
np.isnan()也可以用来判定ndarray中每个元素是否判为缺失值NaN。
print(a_nan == np.nan)
# [False False False False]
print(np.isnan(a_nan))
# [False False True True]
如果原始CSV文件中的数据丢失,则使用np.genfromtxt()在进行读取时,通过参数filling_values来指定用任意值填充缺失的部分。
例如,填充值为0时。
a_fill = np.genfromtxt('./data/12/sample_nan.csv', delimiter=',', filling_values=0)
print(a_fill)
# [[11. 12. 0. 14.]
# [21. 0. 0. 24.]
# [31. 32. 33. 34.]]
使用np.nan_to_num()替换缺失值NaN。
如果将数组ndarray指定为np.nan_to_num()的第一个参数,则默认情况下会创建一个缺失值替换为0的新ndarray。原始ndarray不变
a = np.genfromtxt('./data/12/sample_nan.csv', delimiter=',')
print(np.nan_to_num(a))
# [[11. 12. 0. 14.]
# [21. 0. 0. 24.]
# [31. 32. 33. 34.]]
print(a)
# [[11. 12. nan 14.]
# [21. nan nan 24.]
# [31. 32. 33. 34.]]
如果第二个参数设置为False,则原始ndarray将被更改。
print(np.nan_to_num(a, copy=False))
# [[11. 12. 0. 14.]
# [21. 0. 0. 24.]
# [31. 32. 33. 34.]]
print(a)
# [[11. 12. 0. 14.]
# [21. 0. 0. 24.]
# [31. 32. 33. 34.]]
在NumPy 1.17或更高版本中,您可以指定要用第三个参数nan替换的值。
a = np.genfromtxt('./data/12/sample_nan.csv', delimiter=',')
print(np.nan_to_num(a, nan=-1))
# [[11. 12. -1. 14.]
# [21. -1. -1. 24.]
# [31. 32. 33. 34.]]
函数np.nanmean()用于计算不缺少值的元素的平均值,可以将其替换为平均值。
print(np.nanmean(a))
# 23.555555555555557
print(np.nan_to_num(a, nan=np.nanmean(a)))
# [[11. 12. 23.55555556 14. ]
# [21. 23.55555556 23.55555556 24. ]
# [31. 32. 33. 34. ]]
使用函数np.isnan()判定缺失值是否为NaN,同时可以获得缺失值的位置为True的ndarray。
a = np.genfromtxt('./data/12/sample_nan.csv', delimiter=',')
print(np.isnan(a))
# [[False False True False]
# [False True True False]
# [False False False False]]
通过上述方法,可以通过将任意值分配给缺失值的位置来替换缺失值。 例如:要将其替换为0时。
a[np.isnan(a)] = 0
print(a)
# [[11. 12. 0. 14.]
# [21. 0. 0. 24.]
# [31. 32. 33. 34.]]
也可以使用np.nanmean()替换为平均值。
a = np.genfromtxt('./data/12/sample_nan.csv', delimiter=',')
a[np.isnan(a)] = np.nanmean(a)
print(a)
# [[11. 12. 23.55555556 14. ]
# [21. 23.55555556 23.55555556 24. ]
# [31. 32. 33. 34. ]]