← 返回首页
NAN和INF值处理
发表时间:2024-01-17 00:53:47
NAN和INF值处理

NAN和INF值处理。

1.NaN的特点

NAN:Not A number,不是一个数字的意思,但是他是浮点类型的,所以想要进行数据操作的时候需要注意他的类型。

import numpy as np
data = np.random.randint(0,10,size=(3,5))
data = data.astype(np.float64)
#将数组中某个位置的值设置为NAN
data[0,1]=np.NAN
print(data)

[[ 2. nan  9.  6.  5.]
 [ 4.  4.  0.  9.  2.]
 [ 2.  9.  3.  8.  1.]]

#删除缺失值
#第一种方式: 删除所有NAN的值,因为删除了值后数组将不知道该怎么变化,所以会被变成一维数组。
#~表示取反
print(data[~np.isnan(data)])

#第二种方式: 删除NAN所在行
## 获取哪些行有NAN
lines = np.where(np.isnan(data))[0]
## 使用delete方法删除指定的行,lines表示删除的行号,axis=0表示删除行
print(np.delete(data,lines,axis=0))

[2. 9. 6. 5. 4. 4. 0. 9. 2. 2. 9. 3. 8. 1.]
[[4. 4. 0. 9. 2.]
 [2. 9. 3. 8. 1.]]

有以下score2.csv文件。

姓名,语文,数学,英语
张三,78,98,78
李四,,65,81
王五,77,,91

要求把所有空值替换为0。

#从文件中读取数据
#注意:这里dtype必须设置为object类型
scores = np.loadtxt("score2.csv",delimiter=",",skiprows=1,dtype=np.object_)
'''
当使用numpy.array时,若使用numpy.array()创建array,如果array中元素为String,
创建前字符串长度为L,则对字符串重新赋值时,赋值后的字符串不能超过L,
np会将修改有的字符串自动截断到L。原因为在利用numpy.array()创建array时为每个元素分配了一个固定大小的存储空间,
超出其存储空间的部分会截断。
'''
#scores = np.loadtxt("score2.csv",delimiter=",",skiprows=1,dtype=np.str_)
print(scores)
# 将除第一列的数据转换为float类型
new_arr = scores[:, 1:]
print(new_arr)

#将空数据转换成NAN
new_arr[new_arr == ""] = np.nan
print(new_arr)
#转化成float类型
new_arr = new_arr.astype(np.float_)
#将NAN替换为0
new_arr[np.isnan(new_arr)]=0
print(new_arr)


[['张三' '78' '98' '78']
 ['李四' '' '65' '81']
 ['王五' '77' '' '91']]
[['78' '98' '78']
 ['' '65' '81']
 ['77' '' '91']]
[['78' '98' '78']
 [nan '65' '81']
 ['77' nan '91']]
[[78. 98. 78.]
 [ 0. 65. 81.]
 [77.  0. 91.]]

2.INF

Infinity,代表的是无穷大的意思,也是属于浮点类型。np.inf表示正无穷大,-np.inf表示负无穷大,一般在出现除数为0的时候为无穷大。比如2/0

小结:

  1. NAN:Not A Number的简写,不是一个数字,但是是属于浮点类型。
  2. INF:无穷大,在除数为0的情况下会出现INF。
  3. NAN和所有的值进行计算结果都是等于NAN。
  4. NAN != NAN。
  5. 可以通过np.isnan来判断某个值是不是NAN。
  6. 处理值的时候,可以通过删除NAN的形式进行处理,也可以通过值的替换进行处理。
  7. np.delete比较特殊,通过axis=0来代表行,而其他大部分函数通过axis=1来代表行。