内容目录
NAN的基本知识¶
- NAN:Not a number:不是一个数字的意思,但是数据类型属于浮点类型,所以想要进行数据操作的时候需要注意他的类型。
- INF:Infinity,代表的是无穷大的意思,也是属于浮点类型。np.inf表示正无穷大,np.inf表示负无穷大,一般在出现除数为0的时候为无穷大。
NAN的一些特点:
- 1、NAN和NAN不相等,比如np.NAN != np.NAN 这个条件是成立的。
- 2、NAN和任何值做运算,结果都是NAN
In [1]:
import numpy as np
data = np.random.randint(0, 10, size=(3, 5))
print(data)
[[0 3 5 2 5] [4 4 5 4 4] [0 3 3 0 3]]
In [2]:
data = data.astype(np.float_) # 转换为float
data[0,1] = np.NAN # 0行1列数据置为NAN
data[1,2] = np.NAN
print(data)
[[ 0. nan 5. 2. 5.] [ 4. 4. nan 4. 4.] [ 0. 3. 3. 0. 3.]]
删除缺失值¶
In [4]:
import numpy as np
# 1.删除数组中的所有nan值
data[~np.isnan(data)]
Out[4]:
array([0., 5., 2., 5., 4., 4., 4., 4., 0., 3., 3., 0., 3.])
In [5]:
# 2.删除nan值所在的行
# step1:首先获取nan所在的行和列
lines = np.where(np.isnan(data))
print(lines[0]) # [0]是获取行
# step2:删除nan所在的行
data_del = np.delete(data, lines[0], axis=0)
print(data_del)
[0 1] [[0. 3. 3. 0. 3.]]
用其他值替换nan¶
语文 | 数学 |
---|---|
76 | 90 |
69 | NAN |
77 | 86 |
97 | 88 |
NAN | 100 |
76 | 82 |
93 | 89 |
76 | 90 |
对于上述成绩表,如果想求得每一行总和,NAN直接删除对应行会导致数据不准确。所以需要将NAN替换为0来计算。
In [7]:
# Step1:以字符串方式读取.csv文件(因为空是字符串,所以需要用str先读取)
scores = np.loadtxt('testdata/example_scores.csv', delimiter=',', skiprows=1, encoding='utf-8', dtype=np.str_)
# Step2:将空字符串替换为'0'
scores[scores == ''] = '0'
# Step3:将数据类型转换为float
scores1 = scores.astype(np.float_)
# Step4:求每一行的总和
sum_rows = scores1.sum(axis=1)
print(sum_rows)
[112. 102. 59. 94. 96. 19. 25. 46. 159. 65. 144. 141. 25. 105. 92. 151. 61. 47. 83. 50.]
对于上述成绩表,如果想求得语文的平均分,并且将0的情况替换为平均值
In [8]:
# Step1:进行深拷贝
scores2 = scores.copy()
# Step2:转换为flaot
scores2 = scores2.astype(np.float_)
print(scores2)
# Step3:获取第二列数据
non_zero_cols = scores2[scores2[:, 1] != 0, 1] # ,1代表是第2列数据
# print(non_zero_cols)
# Step4:求第二列数据的平均值
mean = non_zero_cols.mean()
# print(mean)
# Step5:将0的内容替换为平均值
scores2[scores2 == 0] = mean.round(0)
print(scores2)
[[98. 14.] [19. 83.] [11. 48.] [73. 21.] [71. 25.] [19. 0.] [19. 6.] [26. 20.] [99. 60.] [ 0. 65.] [97. 47.] [54. 87.] [19. 6.] [13. 92.] [ 1. 91.] [95. 56.] [ 4. 57.] [19. 28.] [74. 9.] [44. 6.]] [[98. 14.] [19. 83.] [11. 48.] [73. 21.] [71. 25.] [19. 43.] [19. 6.] [26. 20.] [99. 60.] [43. 65.] [97. 47.] [54. 87.] [19. 6.] [13. 92.] [ 1. 91.] [95. 56.] [ 4. 57.] [19. 28.] [74. 9.] [44. 6.]]