python数据分析(四)——numpy中的nan和数据的填充

系列文章:
python数据分析(一)——numpy数组的创建
python数据分析(二)——numpy数组的计算
python数据分析(三)——numpy读取本地数据和索引
python数据分析(五)——numpy+matplotlib实例


numpy中的nan

  • 一、nan和inf
    • 01 numpy中nan的注意点
    • 02 numpy中常用统计函数


一、nan和inf

nan(NAN, Nan):not a number表示不是一个数字, nan是浮点类型,什么时候numpy中会出现nan:

  • 当我们读取本地文件为float的时候,如果有缺失,就会出现nan
  • 当做了一个不合适的计算的时候,比如无穷大(inf)减去无穷大

inf(-inf, inf):infinity inf表示正无穷,-inf表示负无穷,什么时候会出现inf(-inf, +inf)

  • 一个数字除以0(python中会直接报错,numpy中是一个inf或者-inf)

如何指定一个nan或者inf呢?注意type类型是float

nan和inf

In [1]: a = np.inf

In [2]: type(a)
Out[2]: float

In [3]: a = np.nan

In [4]: type(a)
Out[4]: float

01 numpy中nan的注意点

  1. 两个nan是不相等的
In [1]: np.nan == np.nan
Out[1]: False
  1. np.nan != np.nan
In [2]: np.nan != np.nan
Out[2]: True
  1. 利用以上的特性,判断数组中的nan的个数

方法一:

In [3]: t
Out[3]: array([1., 2., nan])
In [4]: np.count_nonzero(t!=t)
Out[4]: 1

t!=t除了nan的地方是true为1,其余地方都是false为0,所以count_nanzero不为零的地方只有nan对应的true的值1

方法二:

In [3]: t
Out[3]: array([1., 2., nan])
In [4]: np.count_nonzero(np.isnan(t))
Out[4]: 1

np.isnan(t)和 t!=t返回的false和true的结果是一样的

  1. 由于2,那么如何判断一个数字是否为nan呢?通过np.isnan(a)来判断,返回bool类型比如希望把nan替换为0
In [5]: t
Out[5]: array([1., 2., nan])
In [6]: t[np.isnan(t)] = 0
In [7]: t
Out[7]: array([1., 2., 0.])
  1. nan和任何值计算都为nan

02 numpy中常用统计函数

在一组数据中单纯地把nan替换为0,如果替换之前的平均值大于0,替换之后的值肯定会变小,所以一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行

  • 求和:t.sum(axis = None)
  • 均值:t.mean(axis = None) 受离群点的影响较大
  • 中值:np.median(t, axis = None)
  • 最大值:t.max(axis = None)
  • 最小值:t.min(axis = None)
  • 极值:np.ptp(t, axis = None) 即最大值和最小值值差
  • 标准差:t.std(axis = None)

在这里插入图片描述

标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,越不稳定

默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

数据的填充


import numpy as np

def fill_ndarray(t):
    for i in range(t.shape[1]):  # 遍历每一列
        temp_col = t[:, i]  # 当前的一列
        nan_num = np.count_nonzero(temp_col != temp_col)
        if nan_num != 0:  # 不为0,说明当前这一列中有nan
            temp_not_nan_col = temp_col[temp_col == temp_col]  # 当前一列不为nan的array

            # 选中当前nan的位置,把值赋值为不为nan的均值
            temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
    return t

if __name__ == '__main__':
    t = np.arange(12).reshape((3, 4)).astype("float")
    t[1, 2:] = np.nan
    t = fill_ndarray(t)
    print(t)

你可能感兴趣的:(numpy,python,数据分析)