13_Numpy数组(ndarray)中含有缺失值(nan)行和列的删除方法

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.]]

你可能感兴趣的:(Numpy)