【Python教程】正儿八经地认识一下pandas(二)

更多教程请私信~

来源:思路实验室 

作者:室长

大家好,欢迎收看思路实验室出品的Python入门教程,我是室长。

在上一期我们学习了从生成DataFrame到读取再到增删改的常用方法。可以看到内容很多,使用起来非常灵活。由于各个知识点之间并非是严格的层级关系,而是更接近于一种网状关系,所以讲解起来会有些困难。这一期我们依然以需求为主导,带大家了解一下如何使用pandas做数据清洗。

可能有些同学还不太了解数据清洗是个什么概念。其实可以拿我们洗菜来举例子:我们买回来的菜没有直接切了就下锅炒的,必须得先择菜洗菜,不然什么泥沙、烂菜叶、细菌都吃到肚子里了。

数据也是一样,很多时候我们要从外部获取数据,获取的数据并不是每条都能够使用的,有的可能缺东西,有的可能格式不对,有的可能数字填错了……如果我们拿着这种乱七八糟的数据去分析、去作图,那肯定是做不出来正确的东西的。

比如表格里有一列是填写员工工资的,填数据的人一不小心给填成手机号了。拿着这个数据去算平均工资还能准?

所以我们需要清理掉这些数据,要么剔除,要么修改。这个过程就叫数据清洗。

上一期中我们添加了一些不完整的数据,导致表格中出现了NaN,这意味着这格数据是空值。有了空值,数据的完整性就比较差,因此我们需要对空值采取一些措施。

有一种解决办法是,去掉含空值的行/列,进行这样的操作使用的是dropna方法

dropna方法和我们之前学习的drop方法是有相似性的,它的axis参数默认为0,即按行删除。如果希望去掉含空值的列则需要设置axis=1。因此这里描述的行和列都是可以替换的。另外注意inplace参数的使用。

直接调用dropna方法而不传递任何参数,就会把所有含空值的行删除掉:

因为每行里都有空值,所以一下子就被删成空表了。

所以这种方法显得过于严格,只要有一个空值一行数据就作废。如果我们希望如果整行都是空值再去删除它,我们可以令参数how='all':

因为没有一行全部是空值,所以没有数据被删除。

在有些情况下,我们是否丢弃含有空值的数据取决于这一行里的空值多不多。如果非空值比较多,可能还有一定的价值,可以保留。如果非空值都没几个就必须抛弃了。这种情况下我们可以令参数thresh=足以保留数据的非空值个数:

因为原先第四行有效数据低于3个,所以被删除掉了。

但在某些情况下,某列数据非常关键,如果某行数据的这一列里出现了空值,就应该删除,那我们可以向subset参数传入相应的列标签或列标签列表:

因为前三行的性别都是NaN,所以被删除掉了。

使用dropna方法我们可以清理一部分无效的数据,然而只要不是所有有空值的行或列都被删除,表格里仍然会存在空值。虽然这对数据的影响已经没有多大了,但毕竟不好看,也会有一些潜在的问题可能产生。这时候我们可以使用fillna方法给空值填上数据。fillna方法同样拥有axis参数和inplace参数,但需要注意的是,虽然有axis参数,但目前并不支持按列去操作,所以目前axis参数是没有意义的。

计算个税时我们使用过fillna方法,那时候我们将所有空值替换为0。这非常方便,但显然不够灵活,并非所有的空值都可以填同一个数据。我们可以把哪一列填什么值的规则写成字典,传入fillna方法:

而如果这个规则既包含行标签又包含列标签,那我们就又可以把规则写成DataFrame了:

因为规则里只对行标签为4的数据进行了规定,所以只有行标签为4的NaN被替换。

除了构建一个固定的规则,我们还可以选取其他的方法来填充空值,比如用上一行的数据填充这一行的空值,或者反过来用下一行的数据填充这一行的空值。这就要给method参数赋值。使用上一行的数据的话需要method='ffill',反之则是method='bfill':

method='ffill'时,第3行的数据填充到了第4行的空值处。

method='bfill'时,第4行的数据填充到了前3行的空值处。

此外,我们还可以通过给limit参数赋值来控制替换的次数。不过这里替换的次数并不是替换多少行数据,而是对于每列来说替换几个空值:

空值处理完了,有数据的地方也未必让我们省心。比如时间。

很多人可能都会有体会,在使用excel表格收集日期信息的时候,不同的人填写的日期格式可以说是五花八门乱七八糟。在pandas中如何将乱糟糟的日期信息改成统一的格式呢?我们可以使用to_datetime方法

其次,有时候我们可能需要计算时间差值,但计算的结果有可能是时间戳或其他的格式,我们可以使用to_timedelta方法,和to_date差不多。目前我们还没有学习用Python处理时间的方法,暂且了解这两个方法可以这样用就好。

此外,还有可能有数据重复的问题。当表格非常大的时候,我们用肉眼去观察数据是否有重复只会变瞎。我们可以使用drop_duplicate方法去掉重复行:

同样,drop_duplicate方法是有inplace参数的。

这一期我们了解了pandas进行数据清洗的常用方法。但这并不完全,比如很多时候我们需要针对数据的合理性来进行清洗。而把不合理的数据找出来,则需要使用loc方法对数据进行筛选。那么在下一期的教程中,我们就会了解在pandas中如何对数据进行筛选。如果这篇文章对你有所帮助,希望能帮室长点个赞和在看,你的鼓励是室长进步的动力!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值