缺失值处理的常用方法:判断、查找、填充及删除

处理缺失值流程与方法汇总:

1.读取数据
import numpy as np
data = np.genfromtxt("test.txt",delimiter=',')     #也可以用其他方法读取数据
print(type(data))
print(data)
# output
<class 'numpy.ndarray'>
[[  1. 100.]
 [  2.  90.]
 [  3.  nan]
 [  4.  70.]
 [  5.  nan]
 [  6.  70.]
 [  7.  85.]
 [  8.  75.]
 [  9.  nan]]

从上面输出结果可以看出该数据是9行2列,其中第二列存在3个缺失值
说明:

  1. np.nan不是空对象。
  2. 对列表中的nan进行操作时不能用"==np.nan"来判断。只能用np.isnan()来操作。
  3. np.nan的数据类型是float。
2.判断数据中是否有空值
  • 利用numpy:np.isnan()函数
np.isnan(data)    # 判断数据是否含空值
# output
array([[False, False],
       [False, False],
       [False,  True],
       [False, False],
       [False,  True],
       [False, False],
       [False, False],
       [False, False],
       [False,  True]])

从输出结果可以看出,非空值返回False,空值返回True

np.isnan(data[:,1])    # 查看第1列是否存在空值(下标从0开始)
np.isnan(data[2,:])    # 查看第2行是否存在空值(下标从0开始)
  • 利用pandas:isnull()函数

1.首先转换数据类型,因为上面读取数据类型为<class ‘numpy.ndarray’>

import pandas as pd
data_pd = pd.DataFrame(data)    #将数据转换成DataFrame类型
print(type(data_pd))
# output
<class 'pandas.core.frame.DataFrame'>

2.进行isnull()操作

data_pd.isnull()     #效果等同于np.isnan()函数,同样会返回布尔值

输出
在这里插入图片描述

data_pd[0].isnull()       #判断第0列是否存在空值(下标从0开始)
data_pd[1].isnull()       #判断第1列是否存在空值(下标从0开始)
data_pd[[0,1]].isnull()   #判断第0列和第1列是否存在空值(下标从0开始),效果等同于data_pd.isnull()
3.统计空值/非空值数量

1.统计每列的空值数量

data_pd.isnull().sum()  # 统计每列的空值数量
#output 00个空值,第13个空值
0    0
1    3
dtype: int64

2.统计每列的非空值数量

data_pd.notnull().sum()  
#output 
0    9
1    6
dtype: int64

3.其他相关操作

data_pd.count()        # 统计所有列的非空值数量
data_pd[1].count()     # 第1列非空数量(下标从0开始)
data_pd.count(axis=1)  # 每行非空值数量,axis=1
4.根据空值筛选数据

1.筛选出data_pd中存在空值的行

data_pd[data_pd.isnull().values==True] 

输出
在这里插入图片描述
2.筛选出第1列为空的所有行(下标从0开始)

data_pd[data_pd[1].isnull()]

输出
在这里插入图片描述

5.查找空值索引
np.where(np.isnan(data_pd))       # data_pd中空值所在的行索引及列索引
np.where(np.isnan(data_pd[1]))    # data_pd中第1列空值所在的行索引
6.填充空值fillna()函数、replace()方法(里面填充的是键值对结构)
# 用指定的数字来填充
data_pd.fillna(0)   # 用0来填充data_pd中的空值
 
# 用指定的函数统计值来填充
data_pd.fillna(data_pd.mean())    # 用data_pd中数据的平均值来填充空值
data_pd.fillna(data_pd.mean()[1]) #指定用第1列数据均值来填充data_pd中空值
data_pd[1]=data_pd[1].fillna(data_pd[1].mean()) #指定用第1列数据均值来填充第1列数据中空值
data_pd.fillna(data_pd.sum())   # 用data_pd中数据的和来填充空值

# 使用插值法填充
data=np.genfromtxt('test.txt',delimiter=',')
data=pd.DataFrame(data)
data[1] = data[1].interpolate()

# 用字典来填充
values = {'0':6, '1': 9}   # 0列空值用6填充,1列空值用9填充
data_pd.fillna(value=values)    
 
# 用指定字符串来填充空值
data_pd.fillna("null")

#上下数据补全 
# 不同的填充方式{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}
# 每列的空值,用其列下方非空数值填充
data_pd.fillna(method="backfill")  
data_pd.fillna(method="bfill")   # 同backfill
# 每列的空值,用其所在列上方非空数值填充,若上方没有元素,保持空值
data_pd.fillna(method="ffill")  
data_pd.fillna(method="pad")     # 同 ffill
 
#limit参数设置填充空值的最大个数
data_pd.fillna(0,limit=1)  # 每列最多填充1个空值,超过范围的空值依然为空
 
#inplace参数空值是否修改原数据data_pd
data_pd.fillna(0,inplace=True)  # inplace为true,将修改作用于原数据
7.删除空值 dropna()函数
8.回归方程充填缺失值

参考:如何处理numpy数组中的空值
Pandas+Numpy 数据中空值的处理操作:判断、查找、填充及删除

处理时间序数据时,缺失值和异常值是常见的问题。针对缺失值,可以使用插值法或者填充法进行处理。而针对异常值,可以使用统计方法或者机器学习方法进行处理。 针对时间序数据的缺失值,常见的处理方法有: 1. 插值法。常用的插值方法包括线性插值、多项式插值、样条插值等。这些方法的原理是根据已有的数据点,拟合出一个函数,然后在缺失值处求解函数的值。需要注意的是,插值法可能会强行拟合出一些异常值,因此需要谨慎使用。 2. 填充法。常用填充方法包括前向填充、后向填充、平均值填充位数填充、众数填充等。这些方法的原理是将缺失值用已有的数据点的某种值进行填充。需要注意的是,填充法可能会引入一些偏差,因此需要选择合适的填充方法。 3. 拟合法。常用的拟合方法包括回归分析、时间序分析、神经网络等。这些方法的原理是根据已有的数据点,拟合出一个模型,然后用模型来预测缺失值。 针对时间序数据的异常值,常见的处理方法有: 1. 统计方法常用的统计方法包括箱线图、Z-score、3-sigma法等。这些方法的原理是根据数据的分布特征,判断哪些数据点是异常值,然后将其删除或者进行修正。 2. 机器学习方法常用的机器学习方法包括聚类、分类、异常检测等。这些方法的原理是根据数据的特征,训练一个模型,然后用模型来判断哪些数据点是异常值。 需要注意的是,处理时间序数据的缺失值和异常值需要根据具体情况选择合适的方法,不同的方法可能会产生不同的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值