numpy平均值插补步骤及详细说明


利用 numpy对数据进行插补是一个非常常见的方法,代码也很多。但是网上的代码一般没有很详细的解释,不利于初学者学习。本帖就是在源代码的基础上添加了相关注释,便于初学者理解。

1.导入numpy工具并读取数据

在文件的同级目录下,建一个名为textdata.txt的数据,然后导入。为了进行示范,数据如下所示。

# numpy 采用平均值法插补缺失数据
import numpy as np

# numpy读取
"""
数据如下所示
A,b,c,d,e
1,9,20,90,100
2,3,15,m,88
3,6,18,n,100
"""
data = np.genfromtxt("textdata.txt", delimiter=",")

2.定义平均值插补函数

1.首先确定数据的列数,然后对每一列开始循环;
2.计算缺失值Nan值个数,如果Nan个数为0,表示没有Nan值,不需要替换,执行下一个列循环;
3.如果有Nan值(Nan值个数大于零),则对该列非Nan的值进行求和,并求出非Nan值的平均值;
4.将计算出的平均值赋值给该列的Nan值;
5.最后将插补后的新列赋值给原始列,完成插补值替换。

# 定义平均值插补函数
def fill_nan_by_column_mean(t):
    for i in range(t.shape[1]):    # 循环01234
        # data.shape表示矩阵的行列维度
        # data.shape[0]表示行维度
        # data.shape[1]表示列维度
        
        # 计算缺失值nan的个数
        nan_num = np.count_nonzero(t[:,i] != t[:,i])
        # np.count_nonzero统计非0值的数量,就是和,True算1
        # data[:,i],i表示列号,表示在i列从头到尾的意思
        # nan不能比较大小,所以nan != nan是True,就表示一个空值
        
        if nan_num > 0:    # 表示有nan
            now_col = t[:,i]
            # 对列求和
            now_col_not_nan = now_col[np.isnan(now_col) == False].sum()
            # np.isnan(now_col)找出空值nan,是nan返回True,不是nan返回False
            # now_col[np.isnan(now_col) == False].sum()表示对所有非nan求和
            
            # 平均值=和/个数
            now_col_mean = now_col_not_nan / (t.shape[0] - nan_num)
            # shape[0]表示行数
            # nan_num表示nan个数
            # t.shape[0] - nan_num 表示非nan的个数
            
            # 赋值给now_col
            now_col[np.isnan(now_col)] = now_col_mean
            # 对nan值进行赋值
            
            # 赋值给t,即更新t的当前列
            t[:,i] = now_col
    return t

3.调用平均值插补函数

# 调用平均值插补函数
fill_nan_by_column_mean(data)

4.插补结果

通过以上步骤,可以得出以下插补结果:

array([[  2.        ,   6.        ,  17.66666667,  90.        ,96.        ],
       [  1.        ,   9.        ,  20.        ,  90.        ,100.        ],
       [  2.        ,   3.        ,  15.        ,  90.        ,88.        ],
       [  3.        ,   6.        ,  18.        ,  90.        ,100.        ]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值