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. ]])