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

本文详细介绍了如何使用NumPy库中的函数删除数组中的缺失值(NaN)。包括删除所有缺失值、删除含缺失值的行和列的方法。适用于数据预处理阶段,确保数据完整性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.ndarray` `NoneType` 在 Python 中,`numpy.ndarray` 是 NumPy 库中用于表示多维数组的对象,而 `NoneType` 表示的是特殊的常量 `None`,用来定义空值或不存在的值。两者之间存在显著的区别。 #### 类型差异 - **NumPy 数组 (`numpy.ndarray`)** 这是一种高效的多维数组对象,专为科学计算设计。可以容纳相同类型的元素,并提供了丰富的操作接口来执矩阵运算其他数学功能[^1]。 - **空值 (`NoneType`)** 它代表没有任何特定类型的占位符,在逻辑判断、函数返回默认值等方面非常有用。需要注意的是,`None` 不应该被当作零长度序或其他形式的实际数据结构使用[^4]。 #### 常见错误场景及其解决方案 ##### 场景一:尝试将 `None` 添加到 NumPy 数组中 如果试图向现有的 `numpy.ndarray` 对象追加一个 `None`,这通常会引发类型转换的问题,因为 NumPy 需要一致的数据类型: ```python import numpy as np arr = np.array([1, 2]) try: arr_with_none = np.append(arr, None) except TypeError as e: print(f"Error occurred: {e}") ``` 为了安全地处理这种情况,可以选择创建一个新的包含可选值(如浮点数允许 NaN)的数组或将所有条目都视为对象类型: ```python # 使用 float 并填充 nan new_arr_float = np.hstack((arr.astype(float), [np.nan])) # 或者作为 object 类型 new_arr_object = np.array(list(arr) + [None], dtype=object) print(new_arr_float) # 输出带有 nan 的新数组 print(new_arr_object) # 输出带 None 的新数组 ``` ##### 场景二:混淆布尔上下文中对 `numpy.ndarray` 的评估 另一个常见的陷阱是在条件语句里直接测试整个 NumPy 数组是否等于某个单一值,比如 `if my_array == some_value:`。这种做法可能会导致模糊的结果,因为在大多数情况下这样的表达式是没有明确定义的。相反,应当利用 `.any()` 或 `.all()` 方法来进逐元素比较: ```python v = np.zeros((2, 2)) if (v != None).all(): # 正确的方式 print("All elements are defined.") else: print("Some elements may be undefined.") # 错误示范 if v is not None: # 即使这里不会抛异常,但不是推荐的做法 pass ``` 实际上,对于像上面那样的二维全零初始化后的数组来说,根本不需要担心其内部有任何未赋初值的情况;但如果确实遇到了可能含有缺失值的情形,则应采用上述更严谨的方法去验证。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值