12_Numpy数组(ndarray)中缺失值(nan)的替换

12_Numpy数组(ndarray)中缺失值(nan)的替换

将NumPy数组ndarray的缺失值NaN(例如np.nan)的元素替换为其他值时,可是使用np.nan_to_num()和np.isnan()布尔值索引的方法。可以将其替换为任意值,或替换为不包含缺失值NaN的元素的平均值。

在此,将对以下进行说明内容。

  • 缺失值NaN的生成和判定
  • np.genfromtxt()参数filling_values的指定
  • np.nan_to_num()缺失值NaN的替换
  • 用布尔值索引的方法替换缺失值NaN

缺失值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]

np.genfromtxt()参数filling_values的指定

如果原始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的替换

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

用布尔值索引的方法替换缺失值NaN

使用函数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.        ]]
参考资源链接:[Python数据清洗:numpy与pandas实战入门](https://wenku.youkuaiyun.com/doc/6401abe8cce7214c316e9f0a?utm_source=wenku_answer2doc_content) 在数据科学和分析领域,numpy和pandas是不可或缺的工具,它们提供了强大的数据处理功能,特别是在数据清洗与预处理方面。为了更好地掌握这些技术,推荐查看资源《Python数据清洗:numpy与pandas实战入门》,该资源深入浅出地介绍了numpy和pandas在数据清洗中的应用。 首先,numpyndarray对象是进行数组排序的基础。可以通过np.sort函数对数组进行排序,例如`sorted_array = np.sort(arr)`将对数组arr进行排序并返回一个新的排序数组。对于一维数组,可以使用`np.argsort`来获取排序后的索引。对于多维数组numpy提供`axis`参数来指定排序的轴。 其次,numpy的搜索功能也非常有用。使用`np.argmax`或`np.argmin`可以快速找到数组中最大值或最小值的索引。通过`np.where`函数,可以找到满足特定条件的元素的索引,这对于数据筛选非常有用。 在pandas中,数据清洗可以从Series和DataFrame两个数据结构出发。Series可以看作是带有标签的数组,而DataFrame则是二维的表格数据结构,类似于Excel表格或SQL表。 处理缺失值是数据清洗的一个重要步骤。在pandas中,可以使用`fillna`方法来填充缺失值,或者使用`dropna`方法删除包含缺失值的行或列。例如,`df.fillna(0)`会将DataFrame df中所有的NaN替换为0。 数据类型转换在数据清洗过程中同样重要。可以使用`astype`方法将DataFrame中的某一列数据类型转换为其他类型,如将字符串转换为整数。例如,`df['column_name'] = df['column_name'].astype(int)`将指定列转换为整数类型。 条件筛选是pandas的核心功能之一,通过`loc`和`iloc`可以基于标签或位置选取数据。`loc`使用标签进行筛选,而`iloc`使用整数位置索引。例如,`df.loc[rows, cols]`可以根据行标签和列标签来筛选数据,而`df.iloc[row_position, col_position]`则基于位置进行筛选。 数据聚合方面,`groupby`方法允许我们对数据进行分组,并可以使用`agg`、`mean`、`sum`等函数对分组后的数据进行聚合计算。例如,`df.groupby('group_column').mean()`将返回按照'group_column'列分组后的数据的平均值。 掌握了这些基础知识后,你可以进一步通过实际操作提升数据清洗的技能。《Python数据清洗:numpy与pandas实战入门》不仅能够帮助你入门,还能在你遇到具体问题时提供解决方案和实际操作的示例。 参考资源链接:[Python数据清洗:numpy与pandas实战入门](https://wenku.youkuaiyun.com/doc/6401abe8cce7214c316e9f0a?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值