python数据清洗实例_2020 版 Python 数据清理终极指南!

news/2024/7/3 1:16:30

c2fdfc039245d688d55132ed67ce2818d21b243e.jpeg?token=c254e0abfec8fdb8c0fcadbf93253623&s=BA9DA14C22A7AB571EEA8191030090CB

作者 | Lianne & Justin

译者 | 陆离

一般来说,我们在拟合一个机器学习模型或是统计模型之前,总是要进行数据清理的工作。因为没有一个模型能用一些杂乱无章的数据来产生对项目有意义的结果。

数据清理或清除是指从一个记录集、表或是数据库中检测和修改(或删除)损坏或不准确的数据记录的过程,它用于识别数据中不完整的、不正确的、不准确的或者与项目本身不相关的部分,然后对这些无效的数据进行替换、修改或者删除等操作。

这是个很长的定义,不过描述的较为简单,容易理解。

为了简便起见,我们在Python中新创建了一个完整的、分步的指南,你将从中学习到如何进行数据查找和清理的一些方法:

缺失的数据;不规则的数据(异常值);不必要的数据——重复数据等;不一致的数据——字母大小写、地址等。在本文中,我们将使用Kaggle提供的俄罗斯房地产数据集(

https://www.kaggle.com/c/sberbank-russian-housing-market/overview/description),目标是要预测一下俄罗斯近期的房价波动。我们不会去清理整个数据集,因为本文只是会用到其中的一部分示例。

在对数据集开始进行清理工作之前,让我们先简单地看一下里面的数据。

6a63f6246b600c339aace6d5d0400409d8f9a1ec.jpeg?token=74bcabc62dc28b952c70761df9b89b3f&s=3D207533091F504D1EF1A1DA030080B2

从上述的结果中,我们了解到这个数据集总共有30471行和292列,还确定了特征是数值变量还是分类变量,这些对我们来说都是有用的信息。

现在可以查看一下“dirty”数据类型的列表,然后逐个进行修复。

让我们马上开始。

缺失的数据

处理缺失的数据是数据清理中最棘手但也是最常见的一种情况。虽然许多模型可以适应各种各样的情况,但大多数模型都不接受数据的缺失。

如何发现缺失的数据?

我们将为你介绍三种技术,可以进一步了解在数据集中的缺失数据。

1、缺失数据的热图

当特征数量较少的时候,我们可以通过热图来进行缺失数据的可视化工作。

4a36acaf2edda3ccc25c2c23c5e56c07213f9208.png?token=ba933a26a6b2a1af33fcdf41c87ee8eb&s=75986C3B4D667D204AEC19D3030050B2

下图显示了前30个特征的缺失数据样本。横轴表示特征的名称;纵轴显示观测的数量以及行数;黄色表示缺失的数据,而其它的部分则用蓝色来表示。

例如,我们看到特征life_sq在许多行中是有缺失值的。而特征floor在第7000行附近几乎就没有什么缺失值。

d31b0ef41bd5ad6ece01f0e24cc76cddb7fd3cd4.jpeg?token=932f5057213ae9c299928cb802bf4bf7&s=3881E11225A71AAE194BE28E030070AF

缺失数据热图

2、缺失数据的百分比列表

当在数据集中有足够多的特征时,我们可以为每个特征列出缺失数据的百分比。

58ee3d6d55fbb2fb3e81cfec8d4675a24723dcbd.jpeg?token=7be87921584cae77f6412a37bdde20b1&s=007045324D226D2048D560DA0000C0B2

这将在下面形成一个列表,用来显示每个特征的缺失值的百分比。

具体来说,我们看到特征life_sq缺失了21%的数据,特征floor则只缺失了1%。这个列表是一个较为有用的汇总,根据它就可以补充热图可视化了。

267f9e2f07082838ac90af5c7395fc074d08f1e8.jpeg?token=50da07363920cd3e8d19b63b12b9369f&s=35307C33111FE1CC4EFDC0DB030080B3

缺失数据的百分比列表——前30个特征

3、缺失数据的直方图

当我们有足够多特征的时候,缺失数据的直方图也是一种技术。

为了了解更多关于观测数据的缺失值样本的信息,我们可以使用直方图来对它进行可视化操作。

4e4a20a4462309f7a0e87617bb0259f5d6cad6c7.png?token=b9512bed53f5def78073a70257c510e0&s=BDA87D331F0854491ADDCDDA030080B2

这个直方图有助于识别30471个观测数据中的缺失值情况。

例如,有6000多个没有缺失值的观测数据,而将近4000个观测数据中仅有一个缺失值。

9213b07eca80653853177de95fd1f442ac34825a.png?token=25503e6ea0a1d7e70de28aefda3a7134&s=10A47C3203564D6A147DADDA030090B1

缺失数据直方图

我们应该怎么做?

对于处理缺失的数据,没有任何一致的解决办法。我们必须在研究了特定的特征和数据集之后,来决定处理它们的最佳方式。

在下文中,分别介绍了四种处理缺失数据的常见方法。但是,如果遇到更复杂的情况,我们就需要利用一些相对更加复杂的方法,比如缺失数据建模等。

1、放弃观察

在统计学中,这种方法被称为列表删除技术。在这个方案中,只要包含了一个缺失值,我们就要删除整条的观测数据。

只有当我们确定所缺失的数据没有提供有用信息的时候,我们才能执行此操作。否则,我们应该考虑使用其它的办法。

当然,也可以使用其它标准来删除观察数据。

例如,从缺失数据的直方图中,我们可以看到总共缺失了至少35个以上的特征观测数据。我们可以创建一个新的数据集df_less_missing_rows,然后删除具有35个以上缺失特征的观测数据。

3812b31bb051f819d7c6ab6a12b81feb2f73e7c6.png?token=50f8b94fabdb141c06b294581fcb57dd&s=05504D334D627D2206CD41DA0300C0B2

2、删除特征

与方案一比较类似,我们只有在确定当前特征没有提供任何有用信息的时候才能执行这个操作。

例如,从缺失数据百分比的列表中,我们注意到hospital_beds_raion的缺失值百分比高达47%。那么,我们就可以删除整个特征数据了。

728da9773912b31bc8788dbc4114637cdab4e126.png?token=e7b1af8412901fda75722a12be2ffcf5&s=25586D334D625D2006E121DB0300C0B2

3、填补缺失数据

当特征是一个数值变量的时候,可以进行缺失数据的填补。我们会将缺失的值替换为相同特征数据中已有数值的平均值或是中值。

当特征是一个分类变量的时候,我们可以通过模式(最频繁出现的值)来填补缺失的数据。

以life_sq为例,我们可以用它的中值来替换这个特征的缺失值。

e850352ac65c1038e6c06b62751dc615b17e89e3.png?token=71ba30094af5b045a29d10fd6d76d77e&s=15187D334D6245200EF431DA030050B2

此外,我们还可以同时对所有的数字特征使用相同的填补数据的方式。

c995d143ad4bd1132205f1898ea3f1094afb0557.jpeg?token=d4a4539956566175dc0bab0940e912c1&s=0450E533014FC34F1CDD8CDE0000C0B3

比较幸运的是,我们的数据集中并没有缺失分类特征的值。然而,我们可以对所有的分类特征进行一次性的模式填补操作。

4、替换缺失的数据

对于分类特征,我们可以添加一个类似于“_MISSING_”这样的值,这是一种新类型的值。对于数值特征,我们可以使用-999这样的特殊值来替换它。

这样,我们仍然可以保留缺失值作为有用的信息。

7a899e510fb30f24428d177f0c998445ad4b034d.png?token=2edb0b33fd3bc55143b95992c480970f&s=29205D324F624D200AF575DB0300C0B2

不规则的数据(异常值)

异常值是与其它的观测值截然不同的数据,它们可能是真正的异常值或者是错误值。

如何发现不规则的数据?

根据特征是数值的还是分类的,我们可以使用不同的技术来研究其分布特点用以检测它的异常值。

1、直方图和方框图

当特征是数值的时候,我们可以使用直方图或者是方框图来检测它的异常值。

下面是特征life_sq的直方图。

43a7d933c895d143790428f3bafcd7045baf0787.png?token=76664db84b744ba5ea9da2735ef0c0dc

由于可能存在异常值,因此,数据准确性的差别看起来是异常显著的。

1c950a7b02087bf4e96745d436df022a11dfcf13.png?token=ee2e20ca5ab7b07de04b270de20dacc6&s=598C3C724B2265205CF590DA0300B0B3

直方图

为了更深入地研究这个特征,下面我们来画一个方框图。

aec379310a55b319b9873ae784a5d720cffc173c.png?token=91bfa88b33dea1fc756a4505e1eeeca6

在这个图中,我们可以看到一个超过7000的异常值。

574e9258d109b3de6ff546700bb33987800a4c77.png?token=e4f1b908f298c4d3a0f0339933185be6&s=5C2834720B0245601CF5D0DA0300C0B2

方框图

2、描述性统计数据

此外,对于数值特征,异常值可能过于明显,以致方框图无法对其进行可视化。相反地,我们可以看看它们的描述性统计数据。

例如,对于特征life_sq,我们可以看到最大值是7478,而75%的四分位数只有43。很明显,7478值是一个异常值。

8d5494eef01f3a292d1692115629e9375d607c21.png?token=219e67b0f0707d095bea682d1a55ffdf

7aec54e736d12f2eb67bc1f58bce80648535683f.jpeg?token=69a5a0c674dd11194f3876e218f77d3c&s=19843C7ACD6275225C7D40DF0300C0B2

3、条形图

对于分类特征,我们可以使用条形图来了解特征的类别以及分布的情况。

例如,特征ecology具有合理的分布,但是,如果有一个类别只有一个叫做“other”的值,那么这肯定就是一个异常值。

d53f8794a4c27d1e90ea7ce4d2d9f868dcc438d0.png?token=bdc4322b0d93352429a8a28e960cb7c9

9c16fdfaaf51f3de3b86685a5de2a5193a2979ef.jpeg?token=f3c7c96867d796a1e0635dd796c88071&s=5CED1C72DCD7EA1B504297F50300502D

条形图

4、其它的技术

还有许多其它的技术也可以用来发现异常值,例如散点图、z-score和聚类等等,在这里将不会一一进行讲解。

我们应该怎么做?

虽然寻找异常值并不是什么难事,但是我们必须确定正确的解决办法来进行处理。它高度依赖于所使用的数据集和项目的目标。

处理异常值的方法有些类似于缺失数据的操作。我们要么放弃、要么调整、要么保留它们。对于可能的解决方案,我们可以参考本文的缺失数据部分。

不必要的数据

在对缺失数据和异常值进行了所有的努力之后,让我们看看关于不必要的数据,这就更简单了。

首先,所有输入到模型中的数据都应该为项目的目标服务。不必要的数据就是数据没有实际的数值。根据不同的情况,我们主要划分了三种类型的不必要数据。

1、无信息或者重复值

有时,一个特征没有有用的信息,因为太多的行具有相同的值。

如何发现无信息或者重复值?

我们可以创建一个具有相同数值的百分比较高的特征列表。

例如,我们在下面指定显示95%以上的具有相同值的行的特征。

bba1cd11728b47108c69bf0d05c296fbfd0323bb.png?token=c1323c3f4a25820df921b71cd50c4e4a&s=01707C32073245201EF9E1DA0300C0B2

我们可以一个一个地研究这些变量,看看它们是否具有有价值的信息,在这里就不显示细节了。

7a899e510fb30f2446aa1bc204998445ac4b03d5.jpeg?token=79cfff1b1db180eaf1cf17032ab446c6&s=2D20743209DB50490CFC05DA0000C0B2

我们应该怎么做?

我们需要了解重复特征背后的原因,当它们真的缺少有用信息的时候,就可以把它们放弃了。

2、不相关的数据

同样,数据需要为项目提供有用的信息。如果这些特征数据与我们在项目中要解决的问题没什么关系,那么它们就是不相关的。

如何发现不相关的数据?

首先,我们需要浏览一下这些特征,以便之后能识别那些不相关的数据。

例如,一个记录多伦多天气的特征数据并不能为预测俄罗斯房价提供任何有用的信息。

我们应该怎么做?

当这些特征数据并不符合项目的目标时,我们就可以放弃它们了。

3、重复数据

重复数据是指存在多个相同的观测值。

重复数据主要包含两种类型。

(1)基于所有特征的重复数据

如何发现基于所有特征的重复数据?

当观察到的所有特征数据都相同的时候,就会发生这种重复现象,这是很容易发现的。

我们首先要去除数据集中的唯一标识符id,然后通过删除重复数据来创建一个名为df_dedupped的数据集。我们通过比较两个数据集(df和df_deduped),找出有多少个重复行。

023b5bb5c9ea15ce4c2f692f7b0c6ff53b87b2e2.png?token=6701c882d6ebcbc7c5daebe24b519447&s=35387D330F624D20087D81DA0300D0B2

得出,10行是完全重复的观察结果。

我们应该怎么做?

我们应该删除这些重复数据。

(2)基于关键特征的重复数据

如何发现基于关键特征的重复数据?

有时最好根据一组唯一的标识符来删除那些重复的数据。

例如,同一建筑面积、同一价格、同一建筑年份的两个房产交易同时发生的可能性几乎为零。

我们可以设置一组关键特征作为交易的唯一标识符,包括timestamp、 full_sq、life_sq、floor、build_year、num_room、price_doc,我们会检查是否有基于这些标识符的副本(重复记录)。

b03533fa828ba61ec344d09b8538c20c314e59ea.png?token=7ff4f09dcfec9cf64ba329ad3fe695b8&s=15087D324D6245205CD4C5D30300C0B1

基于这组关键特征,共有16个副本,也就是重复数据。

1e30e924b899a90164d2b471db995f7d0308f5a1.jpeg?token=4a5aca147d332f85803aa9a9abc1a7e2&s=05706D321587E94F58FD60CA030010B0

我们应该怎么做?

我们可以根据关键特征删除这些重复数据。

960a304e251f95ca2ae303160d1b2a386709520b.png?token=54d82ecf2119346952bd96858497b7fb&s=1D287D330B624D221ACDF5DA030050B2

我们在名为df_dedupped2的新数据集中删除了16个重复数据。

不一致的数据

让数据集遵循特定的标准来拟合模型也是至关重要的。我们需要用不同的方法去探索数据,这样就可以找出不一致的数据了。很多时候,这取决于细致的观察和丰富的经验,并没有固定的代码用来运行和修复不一致的数据。

下面我们将介绍四种不一致的数据类型。

1、大小写不一致

在分类值中存在着大小写不一致的情况,这是一个常见的错误。由于Python中的数据分析是区分大小写的,因此这就可能会导致问题的出现。

如何发现大小写不一致?

先让我们来看看特征sub_area。

b812c8fcc3cec3fd1b6050fc1b848139869427f4.png?token=05c8882ee456a08f5d9ba65226dd1282

它用来存储不同地区的名称,看起来已经非常的标准化了。

71cf3bc79f3df8dcd3f71e000a1d278d4610286f.png?token=9123652199e12e3e77461e7f516c5500&s=5D203D728BE24D205E7D40DF030080B2

但是,有时候在同一个特征数据中存在着大小写不一致的情况。举个例子,“Poselenie Sosenskoe”和“pOseleNie sosenskeo”就可能指的是同一地区。

我们应该怎么做?

为了避免这种情况的发生,我们要么所有的字母用小写,要么全部用大写。

242dd42a2834349b26324f700fe640c836d3be25.png?token=49ea171a48daf0a25c6f955c6255f809&s=1D287532032B41204EF50CDA030080B2

2、数据格式不一致

我们需要实行的另一个标准化是数据格式。这里有一个例子,是将特征从字符串(String)格式转换为日期时间(DateTime)格式。

如何发现不一致的数据格式?

特征timestamp是以字符串的格式来表示日期的。

aa18972bd40735fac9bce38f585d5ab50f24084e.png?token=fe1b4739bd2ce24276801397f8a4edb1&s=296075320F2369224AD931DA0300E0B1

我们应该怎么做?

我们可以使用下面的代码进行转换,并提取出日期或时间的值。之后,会更容易按年或月进行分组的交易量分析。

3、数据的分类值不一致

不一致的分类值是我们要讨论的最后一种不一致数据的类型。分类特征值的数量有限。有时候由于输入错误等原因,可能会存在其它的值。

如何发现不一致的分类值?

我们需要仔细观察一个特征来找出不一致的值,在这里,我们用一个例子来说明一下。

由于我们在房地产数据集中并不存在这样的问题,因此,我们在下面创建了一个新的数据集。例如,特征city的值被错误地定义为“torontoo”和“tronto”。但它们两个都指向了正确的值“toronto”。

一种简单的确认方法是模糊逻辑(或是编辑间隔,edit distance)。它衡量了我们需要更改一个值的拼写用来与另一个值进行匹配的字母差异数量(距离)。

我们知道这些类别应该只有“toronto”、“vancouver”、“montreal”以及“calgary”这四个值。我们计算了所有的值与单词“toronto”(和“vancouver”)之间的距离。可以看到,那些有可能是打字错误的单词与正确的单词之间的距离较小,因为它们之间只差了几个字母而已。

0b55b319ebc4b745d79dcd0f0af04b118a8215b4.png?token=1139bf4bf2f0059f6417150c0deb2eec&s=3D2874321D0B404D18DD01DE0300C0B3

我们应该怎么做?

我们可以设置一个标准将这些错误的拼写转换为正确的值。例如,下面的代码将距离“toronto”2个字母以内的所有值都设置为“toronto”。

37d3d539b6003af386e96f67f026935a1038b67d.png?token=ebcd73962d2ab0f015812acc59927d90&s=1D207532131B40695CFC48DA0300C0B2

4、地址数据不一致

地址特征目前成为了我们许多人最头疼的问题。因为人们经常在不遵循标准格式的情况下,就将数据输入到数据库中了。

如何发现不一致的地址?

我们可以通过查看数据来找到难以处理的地址。即使有时候我们发现不了任何问题,但我们还可以运行代码,对地址数据进行标准化处理。

在我们的数据集中没有属于隐私的地址。因此,我们利用特征address创建了一个新的数据集df_add_ex。

9358d109b3de9c82ebde983da88dd50c18d843df.png?token=57bc9b4171595ee70e3827be46bd5d34&s=3D887D334D667F2018F9B1DB0300D0B3

正如我们所看到的那样,地址数据可是非常不规范的。

d6ca7bcb0a46f21fcc75d9f83d283e660d33aeef.jpeg?token=45696966908c94fdb5b60ed5d0610df2&s=48201D728F484443444914CE0300F0B2

我们应该怎么做?

我们运行下面的代码,目的是将字母统一变成小写的、删除空格、删除空行以及进行单词标准化。

cb8065380cd79123138b6b6a6a380c84b2b7805c.png?token=77a110e858c29938ce46b18dd5b82c9c&s=950875338FD85C41547D40DE030050B2

现在看起来好多了。

f31fbe096b63f6244e42096a4f48befe1a4ca34a.jpeg?token=88d8fe5d83e0b73d500edefa4574111a&s=08205D32857044211EC5D1CC0300C0B2

我们终于完成了,经过了一个很长的过程,清除了那些所有阻碍拟合模型的“dirty”数据。

原文链接:

https://towardsdatascience.com/data-cleaning-in-python-the-ultimate-guide-2020-c63b88bf0a0d

本文为 CSDN 翻译,转载请注明来源出处。

【End】

《原力计划【第二季】- 学习力挑战》正式开始!即日起至 3月21日,千万流量支持原创作者,更有专属【勋章】等你来挑战


http://www.niftyadmin.cn/n/3661302.html

相关文章

[数据库]Oracle的培训讲师是个东北人

2006年12月25日 23:23:00 这是我这么多年来,听过的最痛快的技术培训,或许也是因为我在若干年前就对培训内容比较掌握的缘故吧,当我更感觉是因为Oracle的培训体系之精妙和讲师的妙语连珠,是我重新燃起了对Oracle的兴趣。体系之精妙…

b超可以看出什么_做B超,涂在肚子上黏糊糊的液体是什么?

说到B超检查,相信很多人都做过,尤其是孕妇,在孕期会做这项检查,了解肚子里宝宝的健康,对于普通人来说,也可以进行B超检查,充分判断脏腑器官好坏。作为最基本、最常见的检查项目,大家…

springboot controller里出现异常会导致服务器宕机_教你如何在Spring Boot中使用RSocket...

1. 概述RSocket应用层协议支持 Reactive Streams语义, 例如:用RSocket作为HTTP的一种替代方案。在本教程中, 我们将看到RSocket用在spring boot中,特别是spring boot 如何帮助抽象出更低级别的RSocket API。2. 依赖让我们从添加sp…

带网格的_最美网格员丨船只撞坏防洪墙就跑,有他在,妥妥的解决问题!

你好,我们是:网格员!网格是基层社会治理最小的单元,是社会治理精细化、精准化的重要载体。有一群人,上管天,下管地,中间管空气,他们每天奔波在大街小巷、田间地头,不惧重…

[啃书]身体使用手册 --《You:The owner's manual》

2006年12月16日 21:48:00 去济南会老铁,顺便去泉城路书店逛逛,给豆豆也给自己相本书。挑来挑去,选了本据说是欧美第一健康书,钟南山院士作序的,中文翻译成《You:身体使用手册》。在回泰安的路上,迫不及待的…

[瞭望]RoR 在国内难以建立大型应用

2006年12月14日 20:49:00 这段时间,在使用RoR框架来实现PPA项目。通过这段时间的使用,对RoR有了比较深入的了解,为它的那种卓而不群所折服,所钦佩。但是,也正是因为它的特立独行,我才深深的为它的将来惋惜。…

byte数组转blob类型_Java基础知识之标识符、数据类型和类型转换

1.标识符标识符:变量名,方法名,类名命名规则:由字母,数字,下划线,美元符$ 组成 不能以数字开头 驼峰式命名:myDemo 自明性:应该具有特定的意义 严格区分大小写&#xff1…

[个人]回归

2006年12月12日 17:51:00 我回来了。虽然,经年尘土满征衣。事情在朝好的方向发展,事情或许也有些糟糕,看从哪个角度用哪种心态去看。不过还好,我和我的小组挺过来了,而且有信心坚持下去。整个一个月,blog都…