numpy数组中缺失值nan的替换(1)

1,086 阅读2分钟

关于数值中缺失值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的全部操作了。