小福利,数据分析之数据清洗常用方法

大家好,我是天空之城,今天带来小福利,数据分析之数据清洗常用方法

清洗数据主要分为以下3个步骤:

一、处理缺失值,这一块主要会讲解如何清洗表格中的缺失值。

二、处理重复值,这一块主要会讲解如何清洗表格中的重复值。

三、处理异常值,这一块主要会讲解如何利用布尔索引的方法去除异常数据,是重点也是难点,要认真学哟。

最后再将清洗完的数据导出。

3 处理缺失值
在刚才的练习中,我们可以通过肉眼观测到部分缺失值。在实际的数据分析项目中,我们一般使用df.info()方法查看数据的缺失情况。

在数据基本信息总结中,我们可以看到数据的总量为101942。

其中,日期,省,订单量,单价,销售额这些列的非空数据都比数据总量要小。

当非空数据与数据总量不一致时,说明这份数据有可能存在缺失值。处理这些缺失值的第一步,就是找到它们。

下面我就先来带你使用pandas库查找数据中的缺失值。

3.1 查找缺失值
在pandas库中,我们可以使用isna()方法来查找DataFrame对象以及Series对象中的缺失值。

df/s.isna()可以将查找结果以DataFrame对象或者Series对象的形式进行返回。

检测结果为布尔值:缺失数据会用True来表示,False则代表这里的数据正常。

下面就来感受一下df.isna()方法是如何查看DataFrame对象缺失值的。
#查看mask_data的缺失值
mask_data.isna()
从结果中可以看到它的前5行和后5行。其中True的位置表示该位置的数据为缺失值。

这里显示后5行有大量的缺失值,我们不妨使用df.tail()方法来验证一下mask_data的后5行数据。

pandas库中,NaN代表的就是缺失数据。果不其然,isna()方法返回结果为True的位置对应的都是mask_data数据中的缺失值。
这里可能是数据采集时出了一些问题,对于缺失值,最简单的方法就是将含有缺失值的行直接删除。

当然除了删除之外还有其它处理方法,比如给缺失值填充数据。

由于我们总体的数据量比较大,缺失值占总数据量的比重也比较低,将含有缺失值的行删除后并不会妨碍后续的分析。

因此我们选择较为简易的处理方法,直接将含有缺失值的数据整行删除。下面我来教你如何使用 pandas 库执行这项操作。

3.2 删除缺失值
在pandas库中,我们可以使用dropna()方法直接删除DataFrame对象和Series对象中含有缺失值的数据。

今天这节课我们只关注DataFrame对象是如何删除含有缺失值的数据。

只要执行df.dropna()这一代码方法,就可以将DataFrame对象中包含缺失值的每一行全部删掉。
mask_data.dropna()

可以看到,运行完之后,数据的最后5行发生了变化,说明有一些行已经被删除。
刚才我们运行的mask_data.dropna()代码返回的是一个删掉所有缺失数据的DataFrame对象,但这并不意味着它修改了mask_data数据。

我们需要将mask_data.dropna()的运行结果重新赋值给mask_data变量,这样就可以将运行结果保存下来。

#删除所有缺失值
mask_data = mask_data.dropna()
#查看数据基本信息总结
mask_data.info()
可以看到,所有列的非空数据都与最新的数据总量:100956保持一致,缺失值已经全被删除了。

与之前的数据的总量:101942对比,我们删除了差不多1000行数据,不到总数据的 1% ,并不会对后续的分析产生太大影响。

4. 重复值
重复值很好理解,就跟字面意思一样,指的是表格中重复出现的数据。在多数情况中,重复值都是完全相同的数据。

重复值的处理的第一步和缺失值一样,还是要先查找重复值。
4.1 查找重复值
我们可以直接使用df.duplicated()方法来查找DataFrame对象中的重复数据。duplicated的中文意思是重复的。
使用df.duplicated()方法会返回一个Series对象,找出所有重复值。重复为True,不重复为False。

可以看到,这里的返回结果很长,我们完全没有办法用肉眼进行观察。

我们可以将mask_data.duplicated()方法的返回结果放入中括号 [] 中,用来索引mask_data数据,查看mask_data数据中重复的行。
#查看mask_data中的重复数据
mask_data[mask_data.duplicated()]

可以看到,这份数据中含有大量完全重复的行,这种重复数据并不具备分析的意义,而且会影响数据分析的结果,因此我们需要直接删除。

4.2 删除重复值
我们可以使用pandas库的df.drop_duplicates()方法直接删除DataFrame对象中重复出现的整行数据。

#直接删除所有重复值
mask_data = mask_data.drop_duplicates()
#查看mask_data中的重复数据
mask_data[mask_data.duplicated()]
在运行结果中我们能看见mask_data的表头下面是空的,说明到这里已经没有重复数据了。
现在,数据的总量又变成了:100508,相比于之前删完缺失值的数据:100956,这次又删除了四百多行重复数据,大概占总数据的0.4%,依然不会对分析结果造成太大影响。

5. 异常值
有时数据中有一个或多个异常大或异常小的数值,超出了这份数据实际的限定范围,这样的数值被称为异常值。

我们在数据清洗中要先对异常值进行识别,因为它有可能是一个错误的数值。

对于异常值,我们首先要做的是查看数据的描述性统计信息,检查数据是否存在异常。

5.1 检查异常值
描述性统计在之前的项目中我已经带你学过了,并且介绍了几个常用的统计变量:平均数、中位数、最大值、最小值。

下面,我来跟你介绍一个快速查看描述性统计信息的方法:describe()。

describe()方法可以用来查看pandas库中的Series对象或者DataFrame对象数值型数据的描述性统计信息。

describe()方法返回出来的统计信息分别代表数值型数据的频数统计、平均数、标准差、最小数、第一四分位数、中位数、第三四分位数以及最大值。

在这里插入图片描述
这里我们只需要观察我们之前学过的最大最小值、平均数、中位数就好。

在describe()方法的运行结果中,我们看到了很多数字后面都有e+05 、e+07、e+09 …之类的后缀。

在计算机系统里,e+n代表的是10的n次方。

比如上图的1.005100e+05代表的就是1.005100乘以10的5次方,也就是100510 ,和我们之前info()方法得到的数据总量一致,对应的刚好是这分数据的频数统计,也就是这一列有多少有效值。

1. 订单量的最小值几乎是0

在实际业务中,不可能出现订单量为 0 的情况,所以订单量等于 0 的数据属于异常值。

2. 订单量的最大值几乎是10的九次方

在疫情期间,公司把每一笔的订单量都严格限制在了 100 以内,所以超过 100 的订单量,也都是异常值。

3. 单价的最大值也几乎是10的九次方

这种天文数字的价格一是不可能有人买,二是如果卖出去了我们公司肯定会上新闻。
因此,这三个点都属于这份数据的异常值。
这些异常值会严重影响分析结果的准确性,所以我们需要在分析前将它们清除掉。

在pandas库中,有一种筛选数据的方法叫做布尔索引,下面我就来教你使用布尔索引来对数据进行筛选。

5.2 布尔索引
之前我们有学过使用df[‘colname’]来提取某一列的信息。在pandas库中,我们还可以在df[]中通过表达式的形式来提取一定范围的数据。

比如我们想选择mask_data数据中,订单量一列小于等于100的数据进行查看,就可以设置条件表达式mask_data[‘订单量’] <= 100。

然后把表达式加入括号中索引:mask_data[mask_data[‘订单量’] <= 100],就可以选取mask_data数据中订单量这一列小于等于0的数据。

#查看订单量小于等于100的数据
mask_data[mask_data[‘订单量’] <= 100]

它相当于给订单量中每一个数据都进行了一次比较运算,然后将运算结果以Serie对象的形式进行返回。

在Python中,比较运算的返回结果为True或者False的布尔值。

所以如果这一行的值小于等于100,结果就是True;大于100结果就是False。

我们通过这个Series对象去索引mask_data数据,就能将结果为True对应位置的数据取出来。

回想一下之前查看重复数据的方法,mask_data[mask_data.duplicated()],它的实现方式也是基于布尔索引的原理。
mask_data.duplicated()方法返回的结果也是由布尔值组成的Series对象。

清除异常值后,现在的平均值和中位数与之前比,都变小、变合理了。

但仔细观察我们可以发现订单量数据中还存在最小值为0的异常值,这里我们需要再清除一下。

#筛选mask_data中订单量大于0的数据
mask_data = mask_data[mask_data[‘订单量’] > 0]

可以看到,订单量的最小值变成了1,在一个比较合理的范围之内。

至此,这份数据中订单量的异常值已经处理完毕,接下来我们再来看一下单价一列的异常值。

仔细观察我们发现,单价的最小值已经变成了30,最大值变成了200。

说明上一步清除订单量异常值的时候,单价一列的最大最小值也产生了变化,单价一列的异常值很有可能是跟订单量的异常值同时出现的。

目前的结果:30至200也恰好是一个较合理的口罩价格范围,我们不需要再进行数据筛选。

所以,订单量和单价两列的异常值已经全部清洗完毕了。

到这里,我们的数据清洗工作就已经完成了。我最后再小结一下异常值的相关知识:

6. 写入数据
这里,我们就可以使用df.to_csv()方法,并在括号中填写文件路径:’./工作/mask_data_clean.csv’,将清洗好的数据写入csv文件中。

#保存清洗干净的数据
mask_data.to_csv(’./工作/mask_data_clean.csv’)

打开文件后你会发现,最左侧多了一列数据。
这个数据是DataFrame对象的行索引。
pandas库将csv文件读取为DataFrame对象时都会自动生成行索引。

所以我们写入时也会把行索引单独作为一列写进数据文件中。

这里我们可以使用df.to_csv()方法的index参数来禁止pandas库将行索引写入csv文件中。

index参数是df.to_csv()方法中专门用来设置csv文件行索引显示方式的参数。

它的默认值为True,会让你写入的csv文件包含一列行索引。

如果我们把这个参数设置为index = False就可以取消写入行索引,不用将行索引那一列写入csv文件了。

#保存清洗干净的数据,并取消写入行索引
mask_data.to_csv(’./工作/mask_data_clean.csv’, index = False)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值