13_Numpy数组(ndarray)中含有缺失值(nan)行和列的删除方法
要删除NumPy数组ndarray中包含缺失值NaN的行或列,可以使用np.isnan()确定缺失值,使用any()或all()提取不含缺失值行和列。
在此,将对以下进行说明内容。
- 删除所有的缺失值(NaN)
- 删除包含缺失值(NaN)的行
- 删除包含缺失值(NaN)的列
如果要用其他值代替缺少的值而不是删除它们,请参阅以下文章。
12_Numpy数组(ndarray)中缺失值(nan)的替换
例如,通过np.genfromtxt()读取以下缺少数据的csv。缺失部分成为缺失值NaN。
import numpy as np
a = np.genfromtxt('./data/13/sample_nan.csv', delimiter=',')
print(a)
# [[11. 12. nan 14.]
# [21. nan nan 24.]
# [31. 32. 33. 34.]]
删除所有的缺失值(NaN)
使用函数np.isnan()来确定是否含有缺失值NaN,缺失值的位置的返回值为True。
print(np.isnan(a))
# [[False False True False]
# [False True True False]
# [False False False False]]
通过使用取反运算符〜在此ndarray中将缺失值NaN的位置设置为False,可以删除缺失值(提取不缺失值的元素),但由于剩余元素的数量不同,因此可以删除原始数组ndarray的形状不会保留,而是被展平。
print(~np.isnan(a))
# [[ True True False True]
# [ True False False True]
# [ True True True True]]
print(a[~np.isnan(a)])
# [11. 12. 14. 21. 24. 31. 32. 33. 34.]
删除包含缺失值(NaN)的行
要删除包含缺失值NaN的行,可以使用any()方法,如果NumPy数组行中有一个缺失值则整行返回True。
如果参axis= 1,则确定每一行是否有缺失值。
print(np.isnan(a).any(axis=1))
# [ True True False]
使用取反运算符〜将没有缺失值的行设置为True。
print(~np.isnan(a).any(axis=1))
# [False False True]
删除包含缺失值的行。
print(a[~np.isnan(a).any(axis=1), :])
# [[31. 32. 33. 34.]]
print(a[~np.isnan(a).any(axis=1)])
# [[31. 32. 33. 34.]]
删除包含缺失值(NaN)的列
删除包含缺失值NaN的列时也是如此。 如果在any()中参数axis= 0,则确定每一列是否至少有一个True。使用取反运算符〜将没有任何缺失值的列设置为True。
print(~np.isnan(a).any(axis=0))
# [ True False False True]
删除包含缺失值的列。
print(a[:, ~np.isnan(a).any(axis=0)])
# [[11. 14.]
# [21. 24.]
# [31. 34.]]
如果只想删除缺少值的列,请使用all()而不是any()。
a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
a[2, 2] = np.nan
print(a)
# [[11. 12. nan 14.]
# [21. nan nan 24.]
# [31. 32. nan 34.]]
print(a[:, ~np.isnan(a).any(axis=0)])
# [[11. 14.]
# [21. 24.]
# [31. 34.]]
print(a[:, ~np.isnan(a).all(axis=0)])
# [[11. 12. 14.]
# [21. nan 24.]
# [31. 32. 34.]]