一、缺失值处理办法汇总


检测缺失值:

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 lagrange
import 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.]

 

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM