99网
您的当前位置:首页一、缺失值处理办法汇总

一、缺失值处理办法汇总

来源:99网
⼀、缺失值处理办法汇总

检测缺失值:

1 # 检测缺失值

2 # isnull --判定,如果是缺失值,---True 如果不是,---False --和sum连⽤ --统计各列的缺失值个数3 # notnull --判定,如果有值,True,如果缺失,--False,和sum连⽤ --count类似--统计⾮空数据的数⽬4 # print('缺失值检测:\\n', pd.isnull(data).sum()) ---推荐5 # print('缺失值检测:\\n', pd.notnull(data).sum())1 pd.DataFrame.info()

2 #直接查看个⾏列的具体信息1 np.nan()

⼀、业务法  1.直接删除  优点:简单粗暴

  缺点:容易造成数据的⼤量丢失,造成观测样本缺少  建议使⽤场景:只有当整⾏或者整列为丢失的情况下删除

  参数:pandas.DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None,inplace=False)  

  2.填充特定字段  使⽤建议:

数据特征可分为数值型和类别型,两者出现缺失值时的处理⽅法也是不同的。

缺失值所在特征为数值型时,通常利⽤其均值、中位数和众数等描述其集中趋势的统计量来代替缺失值。

缺失值所在特征为类别型时,则选择使⽤众数来替换缺失值  使⽤场景:

只要不影响数据分布或者对结果影响不是很⼤的情况下,可以使⽤,根绝业务场景进⾏判断优点:不会造成数据丢失,但是可能会影响数据的分布,造成结果误差

  参数:pandas.DataFrame.fillna(value=None, method=None, axis=None, inplace=False,limit=None)  

⼆、插值法

  拟合⼀定的关系来进⾏数据的填充,⽤现有的数据拟合未知的数据。  

  在使⽤ 插值法,

   (1)如果真实数据的关系 是线性的, 那么使⽤线性插值、拉格朗⽇插值、样条插值---结果都是可以接受的   (2)如果真实数据的关系 是⾮线性的,那么使⽤线性插值的结果与真实结果存在差异,   (3)⽽样条插值、拉格朗⽇插值效果明显会⽐线性插值较好⼀些   如果遇到插值 ---推荐使⽤拉格朗⽇插值、样条插值   特殊字符的缺失值--⽆法检测 如:* ? : ' ' ! ...

  1.线性插值

    拟合线性关系进⾏插值

1 # 导⼊插值模块

2 from scipy.interpolate import interp1d # 线性插值模块

3 from scipy.interpolate import lagrange # 拉格朗⽇插值模块

4 from scipy.interpolate import spline # 样条插值模块(新版本--移除了,使⽤interp1d进⾏样条插值) 5

6 # 创建插值数据

7 # ⽤现有的数据---去拟合未知的数据 8 # 长度⼀样的

9 x = np.array([1, 2, 3, 4, 5, 8, 9])10 y = np.array([3, 5, 7, 9, 11, 17, 19])

11 z = np.array([2, 8, 18, 32, 50, 128, 162])12

13 # 使⽤x来分别按照线性插值、拉格朗⽇插值、样条插值 来 拟合出 y z中缺失的值14 # 线性插值

15 # x-->⽤来拟合的数据16 # y --->需要被拟合的数据17 # ⽤x 来拟合y

18 # kind='linear' ---线性的拟合

19 linear_1 = interp1d(x=x, y=y, kind='linear')20 linear_2 = interp1d(x=x, y=z, kind='linear')21

22 print('使⽤线性拟合来拟合数据:\\n', linear_1([6, 7])) # 填写x确实的值来预测y为[ 13. 15.]23 print('使⽤线性拟合来拟合数据:\\n', linear_2([6, 7])) # 填写x确实的值来预测预测z[ 76. 102.]

  2.多项式插值

1 # 样条插值

2 # xk--->⽤来拟合的数据3 # yk ---> 需要被拟合的数据

4 # print(spline(xk=x, yk=y, xnew=[6, 7])) # [ 13. 15.]5 # print(spline(xk=x, yk=z, xnew=[6, 7])) # [ 72. 98.]

  3.拉格朗⽇插值法

  思路:找⼀个基准数组x,⾥⾯缺失值的位置和真实的数据y缺失值的位置⼀样。然后⽤x去拟合y

# 拉格朗⽇插值

# 使⽤x 借助拉格朗⽇多项式 来拟合 y z# 拉格朗⽇插值模块# x --->⽤来拟合的数据# w --->需要被拟合的数据

from scipy.interpolate import lagrange # 拉格朗⽇插值模块

la1 = lagrange(x=x, w=y)la2 = lagrange(x=x, w=z)print('使⽤拉格朗⽇拟合数据:\\n', la1([6, 7])) # [ 13. 15.]print('使⽤拉格朗⽇拟合数据:\\n', la2([6, 7])) # [ 72. 98.]

万能代码:

import pandas as pd

from scipy.interpolate import lagrangeimport numpy as np

# 借助拉格朗⽇插值模块来进⾏具体数值的插值# 以qs⽂件为例来进⾏插值缺失值data = pd.read_excel('./qs.xlsx')print('data:\\n', data)

# 展⽰的⼩数 保留 2位⼩数# 保留两位⼩数

pd.set_option('display.float_format', lambda x: '%.1f' % x)# 插值 类别ID# 定义插值函数

# 确定以 前后多少个 数据来进⾏构建 (拉格朗⽇)关系n = 5

# 循环去查看缺失值的位置for i in range(data.shape[0]): # i 代表⾏下标 # print(i)

# 判定如果是缺失值,就进⾏插值 if np.isnan(data.iloc[i, 1]): # print(i)

if i - n <= 0:#当起始值为1时候 start = 0 else:

start = i - n

# 获取 缺失值的 前后的 n个数据

mask = data.iloc[start:i + n + 1, 1]

print(mask)

# 获取已知的序列 ---以 index为已知的序列x,

# 如果不是 0 1 2 3 这样有序的 ⾏索引---reset_index x = mask.index

# 在x 中 剔除 缺失缺失位置 x

# mask.notnull() ---->bool数组 ---有值就是True,⽆值就是False x = x[mask.notnull()]

print('x:\\n', x)

# 获取 y ---在mask中选择 为True 的数据 y = mask[mask.notnull()].values print('y:\\n', y)

# 进⾏拟合 ---拉格朗⽇多项式来拟合 # 构建拉格朗⽇对象 la = lagrange(x=x, w=y) # 拟合

data.iloc[i, 1] = la([i])print('插值之后的结果:\\n',data)

  4.样条插值

.    拟合样条曲线关系

1 # 样条插值

2 # xk--->⽤来拟合的数据3 # yk ---> 需要被拟合的数据

4 from scipy.interpolate import spline # 样条插值模块(新版本--移除了,使⽤interp1d进⾏样条插值)5 print(spline(xk=x, yk=y, xnew=[6, 7])) # [ 13. 15.]6 print(spline(xk=x, yk=z, xnew=[6, 7])) # [ 72. 98.]

三、、随机森林模拟数据法

因篇幅问题不能全部显示,请点此查看更多更全内容