利用Python进行数据清洗的操作指南

目录
  • 缺失值
  • 异常值
  • 数据不一致
  • 无效数据
  • 重复数据
  • 数据泄漏问题

你一定听说过这句著名的数据科学名言:

在数据科学项目中, 80% 的时间是在做数据处理。

如果你没有听过,那么请记住:数据清洗是数据科学工作流程的基础。 机器学习模型会根据你提供的数据执行,混乱的数据会导致性能下降甚至错误的结果,而干净的数据是良好模型性能的先决条件。 当然干净的数据并不意味着一直都有好的性能,模型的正确选择(剩余 20%)也很重要,但是没有干净的数据,即使是再强大的模型也无法达到预期的水平。

在本文中将列出数据清洗中需要解决的问题并展示可能的解决方案,通过本文可以了解如何逐步进行数据清洗。

缺失值

当数据集中包含缺失数据时,在填充之前可以先进行一些数据的分析。 因为空单元格本身的位置可以告诉我们一些有用的信息。 例如:

  • NA值仅在数据集的尾部或中间出现。 这意味着在数据收集过程中可能存在技术问题。 可能需要分析该特定样本序列的数据收集过程,并尝试找出问题的根源。
  • 如果列NA数量超过 70–80%,可以删除该列。
  • 如果 NA 值在表单中作为可选问题的列中,则该列可以被额外的编码为用户回答(1)或未回答(0)。

missingno这个python库就可以用于检查上述情况,并且使用起来非常的简单,例如下图中的白线是 NA:

import missingno as msno
msno.matrix(df)

对于缺失值的填补计算有很多方法,例如:

  • 平均,中位数,众数
  • kNN
  • 零或常数等

不同的方法相互之间有优势和不足,并且没有适用于所有情况的“最佳”技术。具体可以参考我们以前发布的文章

异常值

异常值是相对于数据集的其他点而言非常大或非常小的值。 它们的存在极大地影响了数学模型的性能。 让我们看一下这个简单的示例:

在左图中没有异常值,我们的线性模型非常适合数据点。 在右图中有一个异常值,当模型试图覆盖数据集的所有点时,这个异常值的存在会改变模型的拟合方式,并且使我们的模型不适合至少一半的点。

对于异常值来说我们有必要介绍一下如何确定异常,这就要从数学角度明确什么是极大或极小。

大于Q3+1.5 x IQR或小于Q1-1.5 x IQR都可以作为异常值。 IQR(四分位距) 是 Q3 和 Q1 之间的差 (IQR = Q3-Q1)。

可以使用下面函数来检查数据集中异常值的数量:

def number_of_outliers(df): 

    df = df.select_dtypes(exclude = 'object') 

    Q1 = df.quantile(0.25)
    Q3 = df.quantile(0.75)
    IQR = Q3 - Q1 

    return ((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).sum()

处理异常值的一种方法是可以让它们等于 Q3 或 Q1。 下面的lower_upper_range 函数使用 pandas 和 numpy 库查找其外部为异常值的范围, 然后使用clip 函数将值裁剪到指定的范围。

def lower_upper_range(datacolumn):
    sorted(datacolumn)
    Q1,Q3 = np.percentile(datacolumn , [25,75])
    IQR = Q3 - Q1
    lower_range = Q1 - (1.5 * IQR)
    upper_range = Q3 + (1.5 * IQR)
    return lower_range,upper_range 

for col in columns:
    lowerbound,upperbound = lower_upper_range(df[col])
    df[col]=np.clip(df[col],a_min=lowerbound,a_max=upperbound)

数据不一致

异常值问题是关于数字特征的,现在让我们看看字符类型(分类)特征。 数据不一致意味着列的唯一类具有不同的表示形式。 例如在性别栏中,既有m/f,又有male/female。在这种情况下,就会有4个类,但实际上有两类。

这种问题目前没有自动处理的办法,所以需要手动进行分析。 pandas 的unique函数就是为了这个分析准备的,下面看一个汽车品牌的例子:

df['CarName'] = df['CarName'].str.split().str[0]
print(df['CarName'].unique())

maxda-mazda, Nissan-nissan, porcshce-porsche, toyouta-toyota等都可以进行合并。

df.loc[df['CarName'] == 'maxda', 'CarName'] = 'mazda'
df.loc[df['CarName'] == 'Nissan', 'CarName'] = 'nissan'
df.loc[df['CarName'] == 'porcshce', 'CarName'] = 'porsche'
df.loc[df['CarName'] == 'toyouta', 'CarName'] = 'toyota'
df.loc[df['CarName'] == 'vokswagen', 'CarName'] = 'volkswagen'
df.loc[df['CarName'] == 'vw', 'CarName'] = 'volkswagen'

无效数据

无效的数据表示在逻辑上根本不正确的值。 例如,

  • 某人的年龄是 560;
  • 某个操作花费了 -8 小时;
  • 一个人的身高是1200 cm等;

对于数值列,pandas的 describe 函数可用于识别此类错误:

df.describe()

无效数据的产生原因可能有两种:

1、数据收集错误:例如在输入时没有进行范围的判断,在输入身高时错误的输入了1799cm 而不是 179cm,但是程序没有对数据的范围进行判断。

2、数据操作错误

数据集的某些列可能通过了一些函数的处理。 例如,一个函数根据生日计算年龄,但是这个函数出现了BUG导致输出不正确。

以上两种随机错误都可以被视为空值并与其他 NA 一起估算。

重复数据

当数据集中有相同的行时就会产生重复数据问题。 这可能是由于数据组合错误(来自多个来源的同一行),或者重复的操作(用户可能会提交他或她的答案两次)等引起的。 处理该问题的理想方法是删除复制行。

可以使用 pandas duplicated 函数查看重复的数据:

df.loc[df.duplicated()]

在识别出重复的数据后可以使用pandas 的 drop_duplicate 函数将其删除:

df.drop_duplicates()

数据泄漏问题

在构建模型之前,数据集被分成训练集和测试集。 测试集是看不见的数据用于评估模型性能。 如果在数据清洗或数据预处理步骤中模型以某种方式“看到”了测试集,这个就被称做数据泄漏(data leakage)。 所以应该在清洗和预处理步骤之前拆分数据:

以选择缺失值插补为例。数值列中有 NA,采用均值法估算。在 split 前完成时,使用整个数据集的均值,但如果在 split 后完成,则使用分别训练和测试的均值。

第一种情况的问题是,测试集中的推算值将与训练集相关,因为平均值是整个数据集的。所以当模型用训练集构建时,它也会“看到”测试集。但是我们拆分的目标是保持测试集完全独立,并像使用新数据一样使用它来进行性能评估。所以在操作之前必须拆分数据集。

虽然训练集和测试集分别处理效率不高(因为相同的操作需要进行2次),但它可能是正确的。因为数据泄露问题非常重要,为了解决代码重复编写的问题,可以使用sklearn 库的pipeline。简单地说,pipeline就是将数据作为输入发送到的所有操作步骤的组合,这样我们只要设定好操作,无论是训练集还是测试集,都可以使用相同的步骤进行处理,减少的代码开发的同时还可以减少出错的概率。

到此这篇关于利用Python进行数据清洗的操作指南的文章就介绍到这了,更多相关Python数据清洗内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python实现数据清洗(缺失值与异常值处理)

    1. 将本地sql文件写入mysql数据库 本文写入的是python数据库的taob表 source [本地文件] 其中总数据为9616行,列分别为title,link,price,comment 2.使用python链接并读取数据 查看数据概括 #-*- coding:utf-8 -*- #author:M10 import numpy as np import pandas as pd import matplotlib.pylab as plt import mysql.connector

  • Python 八个数据清洗实例代码详解

    如果你经历过数据清洗的过程,你就会明白我的意思.而这正是撰写这篇文章的目的——让读者更轻松地进行数据清洗工作. 事实上,我在不久前意识到,在进行数据清洗时,有一些数据具有相似的模式.也正是从那时起,我开始整理并编译了一些数据清洗代码,我认为这些代码也适用于其它的常见场景. 由于这些常见的场景涉及到不同类型的数据集,因此本文更加侧重于展示和解释这些代码可以用于完成哪些工作,以便读者更加方便地使用它们. 数据清洗小工具箱 在下面的代码片段中,数据清洗代码被封装在了一些函数中,代码的目的十分直观.你可

  • 8段用于数据清洗Python代码(小结)

    最近,大数据工程师Kin Lim Lee在Medium上发表了一篇文章,介绍了8个用于数据清洗的Python代码. 数据清洗,是进行数据分析和使用数据训练模型的必经之路,也是最耗费数据科学家/程序员精力的地方. 这些用于数据清洗的代码有两个优点:一是由函数编写而成,不用改参数就可以直接使用.二是非常简单,加上注释最长的也不过11行.在介绍每一段代码时,Lee都给出了用途,也在代码中也给出注释.大家可以把这篇文章收藏起来,当做工具箱使用. 涵盖8大场景的数据清洗代码 这些数据清洗代码,一共涵盖8个

  • Python数据清洗工具之Numpy的基本操作

    1. Numpy(Numberical Python) Anaconda中已经集成了NumPy,可以直接使用.如果想要自行安装的话,可以使用流行的Python 包安装程序 pip 来安装 NumPy,目前使用的是Anaconde的环境进行学习和使用这个库 1.1 这库的安装方法 CMD :pip install numpy 或者使用清华源的镜像库:pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple (直接复制可用) 如果想查

  • python3常用的数据清洗方法(小结)

    首先载入各种包: import pandas as pd import numpy as np from collections import Counter from sklearn import preprocessing from matplotlib import pyplot as plt %matplotlib inline import seaborn as sns plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体 p

  • 利用Python进行数据清洗的操作指南

    目录 缺失值 异常值 数据不一致 无效数据 重复数据 数据泄漏问题 你一定听说过这句著名的数据科学名言: 在数据科学项目中, 80% 的时间是在做数据处理. 如果你没有听过,那么请记住:数据清洗是数据科学工作流程的基础. 机器学习模型会根据你提供的数据执行,混乱的数据会导致性能下降甚至错误的结果,而干净的数据是良好模型性能的先决条件. 当然干净的数据并不意味着一直都有好的性能,模型的正确选择(剩余 20%)也很重要,但是没有干净的数据,即使是再强大的模型也无法达到预期的水平. 在本文中将列出数据

  • 利用Python连接Oracle数据库的基本操作指南

    这里我们采用的是使用Oracle数据库进行相关操作 在连接数据库之间,应下载相应的工具包cx_Oracle,在你安装的Python文件夹中找到script,在路径栏点击输入cmd回车进入命令行输入 pip install cx_Oracle 进行安装,工具包较小,下载较快,大概300kb. 安装好之后,打开Python,新建一个工作区. 1.引入该工具包,使用import关键词,输入 import cx_Oracle 引入该工具包,运行看是否加载成功(结果区为>>空行),无其他内容),则表示加

  • 利用python将json数据转换为csv格式的方法

    假设.json文件中存储的数据为: {"type": "Point", "link": "http://www.dianping.com/newhotel/22416995", "coordinates": [116.37256372996957, 40.39798447055443], "category": "经济型", "name": &qu

  • 利用python数据分析处理进行炒股实战行情

    作为一个新手,你需要以下3个步骤: 1.用户注册 > 2.获取token > 3.调取数据 数据内容: 包含股票.基金.期货.债券.外汇.行业大数据, 同时包括了数字货币行情等区块链数据的全数据品类的金融大数据平台, 为各类金融投资和研究人员提供适用的数据和工具. 1.数据采集 我们进行本地化计算,首先要做的,就是将所需的基础数据采集到本地数据库里 本篇的示例源码采用的数据库是MySQL5.5,数据源是xxx pro接口. 我们现在要取一批特定股票的日线行情 部分代码如下: # 设置xxxxx

  • 利用pandas进行数据清洗的方法

    目录 1.完整性 1.1 缺失值 1.2 空行 2.全面性 列数据的单位不统一 3.合理性 非ASCII字符 4.唯一性 4.1 一列有多个参数 4.2 重复数据 我们有下面的一个数据,利用其做简单的数据分析. 这是一家服装店统计的会员数据.最上面的一行是列坐标,最左侧一列是行坐标.列坐标中,第 0 列代表的是序号,第 1 列代表的会员的姓名,第 2 列代表年龄,第 3 列代表体重,第 4~6 列代表男性会员的三围尺寸,第 7~9 列代表女性会员的三围尺寸. 数据清洗规则总结为以下 4 个关键点

  • 利用python爬取城市公交站点

    目录 页面分析 爬虫 数据清洗 Excel PQ 数据清洗 python数据清洗 QGIS坐标纠偏 导入csv文件 坐标纠偏 总结 利用python爬取城市公交站点 页面分析 https://guiyang.8684.cn/line1 爬虫 我们利用requests请求,利用BeautifulSoup来解析,获取我们的站点数据.得到我们的公交站点以后,我们利用高德api来获取站点的经纬度坐标,利用pandas解析json文件.接下来开干,我推荐使用面向对象的方法来写代码. import requ

  • 利用Python循环(包括while&for)各种打印九九乘法表的实例

    一.for循环打印九九乘法表 #注意:由于缩进在浏览器不好控制,请大家见谅,后续会有图片传入. 1.1 左下角 for i in range(1,10): for j in range(1,i+1): print('%d*%d=%2d\t'%(j,i,i*j),end='') print() 效果图: 1.2 右下角 for i in range(1,10): for k in range(i+1,10): print(end=' ') #此处为返回八个空格,请注意 for j in range

  • MySQL数据库设计之利用Python操作Schema方法详解

    弓在箭要射出之前,低声对箭说道,"你的自由是我的".Schema如箭,弓似Python,选择Python,是Schema最大的自由.而自由应是一个能使自己变得更好的机会. Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证.一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢

  • 利用python生成一个导出数据库的bat脚本文件的方法

    实例如下: # 环境: python3.x def getExportDbSql(db, index): # 获取导出一个数据库实例的sql语句 sql = 'mysqldump -u%s -p%s -h%s -P%d --default-character-set=utf8 --databases mu_ins_s%s > %s.s%d.mu_ins_%d.sql' %(db['user'], db['pwd'], db['host'], db['port'], index, db['serv

  • 利用python微信库itchat实现微信自动回复功能

    前言 在论坛上看到了用Python登录微信并实现自动签到,才了解到一个新的Python库: itchat 利用Python 微信库itchat,可以实现自动回复等多种功能,好玩到根本停不下来啊,尤其是调戏调戏不懂计算机的,特别有成就感,哈哈!! 代码如下: #coding=utf8 import requests import itchat KEY = '8edce3ce905a4c1dbb965e6b35c3834d' def get_response(msg): apiUrl = 'http

随机推荐