本文始发于个人公众号:TechFlow,原创不易,求个关注

今天是pandas数据处理专题的第四篇文章,我们一起来聊聊DataFrame中的索引。

上一篇文章当中我们介绍了DataFrame数据结构当中一些常用的索引的使用方法,比如iloc、loc以及逻辑索引等等。今天的文章我们来看看DataFrame的一些基本运算

数据对齐

我们可以计算两个DataFrame的加和,pandas会自动将这两个DataFrame进行数据对齐,如果对不上的数据会被置为Nan(not a number)。

首先我们来创建两个DataFrame:

import numpy as np
import pandas as pd df1 = pd.DataFrame(np.arange(9).reshape((3, 3)), columns=list('abc'), index=['1', '2', '3']) df2 = pd.DataFrame(np.arange(12).reshape((4, 3)), columns=list('abd'), index=['2', '3', '4', '5'])

得到的结果和我们设想的一致,其实只是通过numpy数组创建DataFrame,然后指定index和columns而已,这应该算是很基础的用法了。

然后我们将两个DataFrame相加,会得到:

我们发现pandas将两个DataFrame加起来合并了之后,凡是没有在两个DataFrame都出现的位置就会被置为Nan。这其实是很有道理的,实际上不只是加法,我们可以计算两个DataFrame的加减乘除的四则运算都是可以的。如果是计算两个DataFrame相除的话,那么除了对应不上的数据会被置为Nan之外,除零这个行为也会导致异常值的发生(可能不一定是Nan,而是inf)。

fill_value

如果我们要对两个DataFrame进行运算,那么我们当然不会希望出现空值。这个时候就需要对空值进行填充了,我们直接使用运算符进行运算是没办法传递参数进行填充的,这个时候我们需要使用DataFrame当中为我们提供的算术方法

DataFrame当中常用的运算符有这么几种:

add、sub、div这些我们都很好理解,那么这里的radd、rsub方法又是什么意思呢,为什么前面要加上一个r呢?

看起来费解,但是说白了一文不值,radd是用来翻转参数的。举个例子,比如说我们希望得到DataFrame当中所有元素的倒数,我们可以写成1 / df。由于1本身并不是一个DataFrame,所以我们不能用1来呼叫DataFrame当中的方法,也就不能传递参数,为了解决这种情况,我们可以把1 / df写成df.rdiv(1),这样我们就可以在其中传递参数了。

由于在算除法的过程当中发生了除零,所以我们得到了一个inf,它表示无穷大。

我们可以在add、div这些方法当中传入一个fill_value的参数,这个参数可以在计算之前对于一边出现缺失值的情况进行填充。也就是说对于对于只在一个DataFrame中缺失的位置会被替换成我们指定的值,如果在两个DataFrame都缺失,那么依然还会是Nan

我们对比下结果就能发现了,相加之后的(1, d), (4, c)以及(5, c)的位置都是Nan,因为df1和df2两个DataFrame当中这些位置都是空值,所以没有被填充。

fill_value这个参数在很多api当中都有出现,比如reindex等,用法都是一样的,我们在查阅api文档的时候可以注意一下。

那么对于这种填充了之后还出现的空值我们应该怎么办呢?难道只能手动找到这些位置进行填充吗?当然是不现实的,pandas当中还为我们提供了专门解决空值的api。

空值api

在填充空值之前,我们首先要做的是发现空值。针对这个问题,我们有isna这个api,它会返回一个bool型的DataFrame,DataFrame当中的每一个位置表示了原DataFrame对应的位置是否是空值。

dropna

当然只是发现是否是空值肯定是不够的,我们有时候会希望不要空值的出现,这个时候我们可以选择drop掉空值。针对这种情况,我们可以使用DataFrame当中的dropna方法。

我们发现使用了dropna之后,出现了空值的行都被抛弃了。只保留了没有空值的行,有时候我们希望抛弃是的列而不是行,这个时候我们可以通过传入axis参数进行控制。

这样我们得到的就是不含空值的列,除了可以控制行列之外,我们还可以控制执行drop的严格程度。我们可以通过how这个参数来判断,how支持两种值传入,一种是'all',一种是'any'。all表示只有在某一行或者是某一列全为空值的时候才会抛弃,any与之对应就是只要出现了空值就会抛弃。默认不填的话认为是any,一般情况下我们也用不到这个参数,大概有个印象就可以了。

fillna

pandas除了可以drop含有空值的数据之外,当然也可以用来填充空值,事实上这也是最常用的方法。

我们可以很简单地传入一个具体的值用来填充:

fillna会返回一个新的DataFrame,其中所有的Nan值会被替换成我们指定的值。如果我们不希望它返回一个新的DataFrame,而是直接在原数据进行修改的话,我们可以使用inplace参数,表明这是一个inplace的操作,那么pandas将会在原DataFrame上进行修改。

df3.fillna(3, inplace=True)

除了填充具体的值以外,我们也可以和一些计算结合起来算出来应该填充的值。比如说我们可以计算出某一列的均值、最大值、最小值等各种计算来填充。fillna这个函数不仅可以使用在DataFrame上,也可以使用在Series上,所以我们可以针对DataFrame中的某一列或者是某些列进行填充:

除了可以计算出均值、最大最小值等各种值来进行填充之外,还可以指定使用缺失值的前一行或者是后一行的值来填充。实现这个功能需要用到method这个参数,它有两个接收值,ffill表示用前一行的值来进行填充,bfill表示使用后一行的值填充。

我们可以看到,当我们使用ffill填充的时候,对于第一行的数据来说由于它没有前一行了,所以它的Nan会被保留。同样当我们使用bfill的时候,最后一行也无法填充。

总结

今天的文章当中我们主要介绍了DataFrame的一些基本运算,比如最基础的四则运算。在进行四则运算的时候由于DataFrame之间可能存在行列索引不能对齐的情况,这样计算得到的结果会出现空值,所以我们需要对空值进行处理。我们可以在进行计算的时候通过传入fill_value进行填充,也可以在计算之后对结果进行fillna填充。

在实际的运用当中,我们一般很少会直接对两个DataFrame进行加减运算,但是DataFrame中出现空置是家常便饭的事情。因此对于空值的填充和处理非常重要,可以说是学习中的重点,大家千万注意。

今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

本文使用 mdnice 排版

最新文章

  1. 关于博弈论中的一硬币正反问题的分析<二>
  2. [问题] UISearchBar 点击取消后跳动的问题
  3. ionic ngcordova barcodescanner
  4. Vi的几种退出方式
  5. Oracle 数据库 Database Express Edition 11g Release 2 (11.2) 错误解决集锦(使用语法)
  6. Keil增量编译build异常
  7. 定位于定位优化(iOS)
  8. Longge的问题(欧拉,思维)
  9. hdu4099
  10. React使用笔记1-React的JSX和Style
  11. .NET 对象序列化和系列化德
  12. express实践(一)
  13. dom操作相关,byebye T T
  14. Redis安装、命令以及设置密码遇到的问题
  15. WEB框架-Django组件学习-分页器学习
  16. Visual Studio 2012编译的程序无法在XP下运行的解决办法【转】
  17. fiddler 学习笔记1-下载安装、开启、关闭抓包功能
  18. jdbc配置Spring
  19. innobackupex 备份 Xtrabackup 增量备份
  20. Linux 查看对外开放端口

热门文章

  1. Volatile关键字的解读
  2. Spring事务的传播级别
  3. 前端开发,页面加载速度性能优化,如何提高web页面加载速度
  4. 你从来没了解过的CSS浮动
  5. Git上传本地项目到远程仓库
  6. 通过调试对WriteFile()API的钩取
  7. Redis的主从复制(基本入门)
  8. 方正璞华Java面试总结(武汉)
  9. python 生成器(四):生成器基础(四)标准库中的生成器函数
  10. easyui的组合网格:combogrid的选中事件