NAN和INF值处理

NAN和INF值处理

首先我们要知道这两个英文单词代表的什么意思:

  1. NANNot A number,不是一个数字的意思,但是他是属于浮点类型的,所以想要进行数据操作的时候需要注意他的类型。
  2. INFInfinity,代表的是无穷大的意思,也是属于浮点类型。np.inf表示正无穷大,-np.inf表示负无穷大,一般在出现除数为0的时候为无穷大。比如2/0

NAN一些特点:

  1. NAN和NAN不相等。比如np.NAN != np.NAN这个条件是成立的。
  2. NAN和任何值做运算,结果都是NAN。

有些时候,特别是从文件中读取数据的时候,经常会出现一些缺失值。缺失值的出现会影响数据的处理。因此我们在做数据分析之前,先要对缺失值进行一些处理。处理的方式有多种,需要根据实际情况来做。一般有两种处理方式:删除缺失值,用其他值进行填充。

删除缺失值:

有时候,我们想要将数组中的NAN删掉,那么我们可以换一种思路,就是只提取不为NAN的值。示例代码如下:

# 1. 删除所有NAN的值,因为删除了值后数组将不知道该怎么变化,所以会被变成一维数组
data = np.random.randint(0,10,size=(3,5)).astype(np.float)
data[0,1] = np.nan
data = data[~np.isnan(data)] # 此时的data会没有nan,并且变成一个1维数组

# 2. 删除NAN所在的行
data = np.random.randint(0,10,size=(3,5)).astype(np.float)
# 将第(0,1)和(1,2)两个值设置为NAN
data[[0,1],[1,2]] = np.NAN
# 获取哪些行有NAN
lines = np.where(np.isnan(data))[0]
# 使用delete方法删除指定的行,axis=0表示删除行,lines表示删除的行号
data1 = np.delete(data,lines,axis=0)

用其他值进行替代:

有些时候我们不想直接删掉,比如有一个成绩表,分别是数学和英语,但是因为某个人在某个科目上没有成绩,那么此时就会出现NAN的情况,这时候就不能直接删掉了,就可以使用某些值进行替代。假如有以下表格:

数学 英语
59 89
90 32
78 45
34 NAN
NAN 56
23 56

如果想要求每门成绩的总分,以及每门成绩的平均分,那么就可以采用某些值替代。比如求总分,那么就可以把NAN替换成0,如果想要求平均分,那么就可以把NAN替换成其他值的平均值。示例代码如下:

scores = np.loadtxt("nan_scores.csv",skiprows=1,delimiter=",",encoding="utf-8",dtype=np.str)
scores[scores == ""] = np.NAN
scores = scores.astype(np.float)
# 1. 求出学生成绩的总分
scores1 = scores.copy()
socres1.sum(axis=1)

# 2. 求出每门成绩的平均分
scores2 = scores.copy()
for x in range(scores2.shape[1]):
    score = scores2[:,x]
    non_nan_score = score[score == score]
    score[score != score] = non_nan_score.mean()
print(scores2.mean(axis=0))
scores = np.loadtxt("nan_scores.csv",delimiter=",",skiprows=1,encoding="utf-8",dtype=np.str)
scores[scores == ""] = np.NAN
scores1 = scores.astype(np.float)
scores1[np.isnan(scores1)] = 0
# 除了delete用axis=0表示行以外,其他的大部分函数都是axis=1来表示行。
scores1.sum(axis=1)

输出:

array([148. , 122. , 123.5,  34. ,  56. ,  79. ])
scores2 = scores.astype(np.float)
for x in range(scores2.shape[1]):
    col = scores2[:,x]
    non_nan_col = col[~np.isnan(col)]
    mean = non_nan_col.mean()
    col[np.isnan(col)] = mean
scores2

输出:

array([[59. , 89. ],
       [90. , 32. ],
       [78. , 45.5],
       [34. , 55.7],
       [56.8, 56. ],
       [23. , 56. ]])

总结:

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来代表行。

posted @   坤坤无敌  阅读(1666)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示