关于数值中缺失值nan的替换, 小编了解有一种方法,使用numpy.isnan(即布尔索引)进行缺失值的替换
我们要了解为什么会出现nan,通常是因为我们在使用numpy.loadtxt()读取csv数据的时候,默认情况下,缺失部分的数据会变为nan。 nan通常是因为数据中分母为零 或被除数为零导致的。
首先我们先要判断数据中的缺失数据是否为nan。
不可以使用'=='的方式进行nan的判断
import numpy as np
print(np.nan == np.nan)
可以使用np.isnan()的方法判断缺失值是否为nan
import numpy as np
print(np.isnan(np.nan))
使用布尔索引的方法替换缺失值
我们可以使用numpy.isnan()确定缺失值的位置
import numpy as np
t = np.arange(24).reshape(4, 6).astype(float)
t[2, 3:] = np.nan
print(np.isnan(t))
之后 我们可以用任意数替换缺失值nan 比如让0替换。
import numpy as np
t = np.arange(24).reshape(4, 6).astype(float)
t[2, 3:] = np.nan
t[np.isnan(t)] = 0
print(t)
但这往往会使之后计算关于这些数据的种种操作出现一定的偏差。 所以我们通常使用平均值的方法替换掉缺失值
import numpy as np
def fill_ndarray(t1):
for i in range(t1.shape[1]): # shape[1]表示一共有四列 [1]表示的是维度
f = t1[:, i] # 选取当前这一列
nan_num = np.count_nonzero(f != f) # 计算每一列nan的个数
if nan_num > 0: # 说明当前这列有nan
f_not_nan = f[f == f] # 存储当前一列不为nan的数组
f_not_nan_num = f_not_nan.mean() # 算出当前那列不为nan的均值
f[f != f] = f_not_nan_num # 把均值赋值给当前那列为nan的数值 也可以用f[np.isnan(f)] = f_not_nan_num
return t1
if __name__ == '__main__':
t1 = np.arange(12).reshape(3, 4).astype(float)
t1[1, 2:] = np.nan
print(t1)
t1 = fill_ndarray(t1)
print(t1)
这就是关于使用布尔索引替换掉缺失值nan的全部操作了。