• 今日进度


    数据挖掘过程中,采集的原始数据里存在着各种不利于分析与建模工作的因素,比如数据不完整、数据矛盾、异常值等。这些因素不仅影响建模的执行过程,更有甚者在不知不觉间给出错误的建模结果,这就使得数据清洗显得尤为重要。但是数据清洗并不是数据预处理的全部内容,它只是第一步而已,接下来还有数据集成、数据转换和数据规约等一系列处理。在实际应用中,数据预处理的工作量占整个建模过程的60%,可以说,预处理做得好,模型基本就出来了。

    数据预处理的主要内容包括:

    数据清洗;
    数据集成;
    数据转换;
    数据规约;
    但是在这一篇里,我们只讲数据清洗,其他部分会慢慢整理。

    数据清洗主要是删除原始数据中的无关数据,重复数据,平滑噪声数据,筛选掉与建模目的无关的数据,处理缺失值与异常值等。

    缺失值处理
    除了很明显的缺失值(单元格处无值)之外,还有一种隐形的缺失值,比如,你要分析一个人从2018年初到现在每个月的收入情况,加入某个月这个人完全没有收入,账单流水中是不会显示这种情况的,如果你想把对这些没有收入的月份进行缺失值处理的话,首先你就要找出哪些月份不在账单流水中。那么请看下面这个链接中的文章吧,文章会给出2018年初到现在连续的日期,你只需要匹配一下就知道哪些月份不在账单中了。

    缺失值处理 - 获取一段时间内所有日期的列表 - (Python、MySQL)

    处理缺失值的方法分为3类:删除、插补、不处理。

    删除缺失值
    如果通过删除小部分的数据就可以达到目标,那么这无疑是最简单高效的办法。但是考虑到数据采集的不易,因此一般不会轻易删除数据。

    先来看看数据的大致情况

    import pandas as pd

    #读取文件
    datafile = u'E:\\pythondata\\tt.xlsx'#文件所在位置
    data = pd.read_excel(datafile)#如果是csv文件则用read_csv
    print("显示缺失值,缺失则显示为TRUE:\n", data.isnull())#是缺失值返回True,否则范围False
    print("---------------------------------\n显示每一列中有多少个缺失值:\n",data.isnull().sum())#返回每列包含的缺失值的个数
    运行结果:

    显示缺失值,缺失则显示为TRUE:
    姓名 身高 性别 血型 出生年份 籍贯
    0 False False False False False False
    1 False False False False False True
    2 True True True True True True
    3 False False False False False False
    4 False False False False False False
    5 False False False False False False
    6 False True True False True True
    7 False False False False False False
    ---------------------------------
    显示每一列中有多少个缺失值:
    姓名 1
    身高 2
    性别 2
    血型 1
    出生年份 2
    籍贯 3
    dtype: int64
    删除缺失值具体的情况是一下几种:

    data.dropna() #直接删除含有缺失值的行
    data.dropna(axis = 1) #直接删除含有缺失值的列
    data.dropna(how = 'all') #只删除全是缺失值的行
    data.dropna(thresh = 3) #保留至少有3个非空值的行
    data.dropna(subset = [u'血型 ']) #判断特定的列,若该列含有缺失值则删除缺失值所在的行
    dropna官网介绍文档

    插补缺失值
    常见的插补方法:

    看一眼源数据:

    import pandas as pd

    #读取文件
    datafile = u'E:\\pythondata\\ttt.xlsx'#文件所在位置
    data = pd.read_excel(datafile)#如果是csv文件则用read_csv
    print("显示源数据data:\n", data)#是缺失值返回True,否则范围False
    print("------------------\n用均值插补后的数据data:\n", data.fillna(data.mean()))
    运行结果:

    显示源数据data:
    姓名 工资
    0 张三 11687.0
    1 李四 10237.0
    2 王五 8971.0
    3 赵六 9310.0
    4 马七 15890.0
    5 杨八 NaN
    6 谭九 12361.0
    7 黄十 9219.0
    ------------------
    用均值插补后的数据data:
    姓名 工资
    0 张三 11687.000000
    1 李四 10237.000000
    2 王五 8971.000000
    3 赵六 9310.000000
    4 马七 15890.000000
    5 杨八 11096.428571
    6 谭九 12361.000000
    7 黄十 9219.000000
    简单的缺失值插补方法:

    data.fillna(data.mean()) #均值插补
    data.fillna(data.median()) #中位数插补
    data.fillna(data.mode()) #众数插补
    data.fillna(data.max()) #最大值插补
    data.fillna(data.min()) #最小值插补
    data.fillna(0) #固定值插补--用0填充
    data.fillna(5000) #固定值插补--用已知的行业基本工资填充
    data.fillna(method='ffill')#最近邻插补--用缺失值的前一个值填充
    data.fillna(method='pad') #最近邻插补--用缺失值的前一个值填充
    通过拟合函数来插补的方法:

    主要说一说拉格朗日插值法吧,除了拉格朗日插值法,还有牛顿插值法、Hermite插值法、分段插值法和样条插值法。有兴趣的可以把后几种方法的代码也研究出来。

    下面是拉格朗日插值法的博客链接,因为写的很细,所以就不重复了,点击链接跳转去看一看吧。

    文章链接:数据预处理 - 缺失值处理 - 拉格朗日插值法

    或者,也可以使用缺失值所在行的上一行填补缺失值:

    文章链接:缺失值处理 - 定位空值并用空值的上一个值填充 - (Excel)_Not Found黄小包-CSDN博客_excel填充空值

    不处理缺失值
    不处理就是不管,所以此处省略一万字......

    重复值处理
    在Pandas中,.duplicated()表示找出重复的行,默认是判断全部列,返回布尔类型的结果。对于完全没有重复的行,返回 False,对于有重复的行,第一次出现的那一行返回 False,其余的返回 True。

    与.duplicated()对应的,.drop_duplicates()表示去重,即删除布尔类型为 True的所有行,默认是判断全部列。

    import pandas as pd
    import numpy as np
    from pandas import DataFrame,Series

    #读取文件
    datafile = u'E:\\pythondata\\tt.xlsx'#文件所在位置,u为防止路径中有中文名称,此处没有,可以省略
    data = pd.read_excel(datafile)#datafile是excel文件,所以用read_excel,如果是csv文件则用read_csv
    examDf = DataFrame(data)

    #去重
    print(examDf.duplicated())#判断是否有重复行,重复的显示为TRUE,
    examDf.drop_duplicates()#去掉重复行

    #指定某列判断是否有重复值
    print(examDf.duplicated('name'))#判断name列是否有重复行,重复的显示为TRUE,
    examDf.drop_duplicates('name')#去掉重复行

    #根据多列判断是否有重复值
    print(examDf.duplicated(['name','sex','birthday']))#判断name,sex,birthday列是否有重复行,重复的显示为TRUE,
    examDf.drop_duplicates(['name','sex','birthday'])#去掉重复行
    此处只是放出代码来,若想要了解更多,比如数据源和代码运行结果比较,可点击下面链接查看:

    Python数据预处理 - 数据清洗 - 重复值处理

    异常值处理
    数据清洗过程中的异常值的处理,是选择剔除还是用其他值代替,需要视情况而定。有些异常值可能包含某些信息,需认真思考后采取处理方法。

    常见的异常值处理办法:

    遍历查找异常值,并根据规则调整大小
    文章链接:异常值处理 - iterrows()对 DataFrame 进行遍历,并修改遍历中的异常值 - Python代码

    删除异常值
    import pandas as pd #导入pandas库

    inputfile = u'E:\\pythondata\\ttt.xlsx'

    data= pd.read_excel(inputfile)

    #将工资低于1000或者高于10万的异常值清空
    data[u'工资'][(data[u'工资']<1000) | (data[u'工资']>100000)] = None

    #清空后删除
    print(data.dropna())
    视为缺失值后进行插补
    #将工资低于1000或者高于10万的异常值清空
    data[u'工资'][(data[u'工资']<1000) | (data[u'工资']>100000)] = None

    #清空后用均值插补
    print(data.fillna(data.mean()))
    除了用均值插补之外还可以用中位数、众数、最值、固定值、最近邻值、拉格朗日等插值,具体方法往前翻,上面刚写完。

    原文链接:https://blog.csdn.net/weixin_40683253/article/details/81665896

  • 相关阅读:
    python编码小记
    eventlet学习笔记
    python库文件路径
    paste deploy初探
    python浅拷贝与深拷贝
    Javascript basic knowledge
    用大数据学习心理学
    Postgres Database management operations
    Python Socket and WSGI Sample
    Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory错误处理
  • 原文地址:https://www.cnblogs.com/hanmy/p/14882521.html
Copyright © 2020-2023  润新知