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

今天是pandas数据处理专题的第5篇文章,我们来聊聊pandas的一些高级运算。

在上一篇文章当中,我们介绍了panads的一些计算方法,比如两个dataframe的四则运算,以及dataframe填充Null的方法。今天这篇文章我们来聊聊dataframe中的广播机制,以及apply函数的使用方法。

dataframe广播

广播机制我们其实并不陌生, 我们在之前介绍numpy的专题文章当中曾经介绍过广播。当我们对两个尺寸不一致的数组进行运算的时候,系统会自动将其中维度较小的那个填充成和另外一个一样再进行计算。

比如我们将一个二维数组减去一个一维数组,numpy会先将一位数组拓展到二维之后再进行减法运算。看起来就像是二维数组的每一行分别减去了这一个一维数组一样。可以理解成我们将减去这一个一维数组的操作广播到了二维数组的每一行或者是每一列当中。

在上面这个例子当中我们创建了一个numpy的数组,然后减去了它的第一行。我们对比下最后的结果会发现,arr数组当中的每一行都减去了它的第一行。

同样的操作在dataframe也一样可以进行。

我们当然也可以对某一列进行广播,但是dataframe四则运算的广播机制默认对行生效,如果要对列使用的话,我们需要使用算术运算方法,并且指定希望匹配的轴。

函数与映射

pandas的另外一个优点是兼容了numpy当中的一些运算方法和函数,使得我们也可以将一些numpy当中的函数运用在DataFrame上,这样就大大拓展了使用方法以及运算方法。

比如我们要将DataFrame当中所有的元素变成它的平方,我们利用numpy的square方法可以很容易做到:

我们可以将DataFrame作为numpy函数的参数传入,但如果我们想要自己定义一个方法并且应用在DataFrame上怎么办?

我们可以利用apply方法很容易地实现这一点,apply方法有些像是Python原生的map方法,可以对DataFrame当中的每一个元素做一个映射计算。我们只需要在apply方法当中传入我们想要应用在DataFrame上的方法即可,也就是说它接受的参数是一个函数,这是一个很典型的函数式编程的应用。

比如我们想要对DataFrame进行平方操作,我们也可以将np.square函数当做参数传入。

apply方法除了可以用在一整个DataFrame上之外,我们也可以让它应用在某一行或者是某一列或者是某一个部分上,应用的方法都是一样的。比如我们可以这样对DataFrame当中的某一行以及某一列应用平方这个方法。

另外,apply中函数的作用域并不只局限在元素,我们也可以写出作用在一行或者是一列上的函数。比如我们想要计算出DataFrame当中每一列的最大值,我们可以这样写:

这个匿名函数当中的x其实是一个Series,那这里的max就是Series自带的max方法。也就是说apply的作用范围是Series,虽然最终的效果是每一个元素都被改变了,但是apply的作用域并不是元素而是Series。我们通过apply操作行或者列,行和列将改变应用到每一个元素。

同样我们也可以将apply的应用对象限定为行,同样我们需要通过传入axis来限定,我们可以传入axis='columns',也可以指定axis=1,这两者的效果是一样的。

另外,apply返回的结果并不一定只能是标量,也可以是多个值组成的list或者是Series,其实两者也是一样的,因为即使返回List也会被转化成Series。

最后我们来介绍一下applymap,它是元素级的map,我们可以用它来操作DataFrame中的每一个元素。比如我们可以用它来转换DataFrame当中数据的格式。

之所以我们叫它applymap而不是map,是因为在Series的方法当中,已经有了map,所以为了区分创建了applymap。

这里要注意,如果将上面代码中的applymap改成apply是会报错的。报错的原因也很简单,因为apply方法的作用域不是元素而是Series,Series并不支持这样的操作。

总结

今天的文章我们主要介绍了pandas当中apply与applymap的使用方法, 这两个方法在我们日常操作DataFrame的数据非常常用,可以说是手术刀级的api。熟练掌握对于我们搞定数据处理非常有帮助,如果大家理解Python中原生的map方法的应用,相信一定也可以很顺利地理解今天的文章。

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

- END -

pandas | 详解DataFrame中的apply与applymap方法的更多相关文章

  1. 详解js中的apply与call的用法

    前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受 ...

  2. 详解python中的__init__与__new__方法

    一.__init__和__new__方法执行的顺序? 在面向对象中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行. 二.__new__方法是什么? 首先,我们先来看下 ...

  3. 【转】详解JavaScript中的this

    ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...

  4. 详解javascript中的this对象

    详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...

  5. (数据科学学习手札140)详解geopandas中基于pyogrio的矢量读写引擎

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,前不久我在一篇文章中给大家分享 ...

  6. jQuery:详解jQuery中的事件(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...

  7. 图文详解Unity3D中Material的Tiling和Offset是怎么回事

    图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...

  8. 【转】详解C#中的反射

    原帖链接点这里:详解C#中的反射   反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...

  9. 详解Webwork中Action 调用的方法

    详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...

随机推荐

  1. ADB-常见命令使用详解

    ADB命令使用详解 ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备. 1.连接android设置adb connect 设备名例如:adb con ...

  2. PDFtoWORD_V1.1版本支持PDF文档中的文字和图片一起转化到word文档中了~

    ​    昨天菜鸟小白做了一个小软件——PDFtoWORD,作用就是将pdf文件中的文字提取出来自动转化为可编辑的word类型.但是这个软件目前也只能将文件PDF中的文字提取出来,还无法提取图片.为了 ...

  3. 基于python的自动化测试框架搭建

    滴~ 今日打卡!   好多天没来打卡了.博主最近一直在把碎片化知识转化为知识体系的过程中挣扎.Python语言.selenium.unittest框架.HTMLTestRunner框架都有所了解,也写 ...

  4. Python+selenium自动化测试之浏览器基础操作

    **​​前言** 本文主要讲解webdriber框架,Selenium 就像真实用户所做的一样,Selenium 测试可以在 Windows.Linux 和 Macintosh上的 Internet ...

  5. 集训作业 洛谷P1101 单词方阵

    这个题的长度真的有点长,我直接放图片吧 这个题又是一个和谐的搜索,找到yizhong的y就开始8面搜索,遇见正确的字母就继续搜索,不正确就果断放弃,果然又是一个和谐的搜索呢. #include< ...

  6. day10:函数的实参&形参

    函数的参数 (参数:配合函数运算的值)参数:      (1)形参:形式参数,在函数的定义处      (2)实参:实际参数,在函数的调用处 形参: 普通形参(位置) , 默认形参 , 普通收集形参 ...

  7. [并发编程] -- ThreadPoolExecutor篇

    Executor框架 Executor框架的两级调度模型(基于HotSpot) 在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定 ...

  8. Git 撤销更改

    一.未使用 git add 缓存代码时 可以使用 git checkout -- filepathname (比如: git checkout -- readme.md  ,不要忘记中间的 “--” ...

  9. lua 表

    最近在尝试配置 awesome WM,因此粗略地学习了一下 lua . 在学习过程中,我完全被表表在 lua 中的应用所镇住了. 表在 lua 中真的是无处不在:首先,它可以作为字典和数组来用:此外, ...

  10. 在 Laravel 中通过自定义分页器分页方法实现伪静态分页链接以利于 SEO

    我们知道,Laravel 自带的分页器方法包含 simplePaginate 和 paginate 方法,一个返回不带页码的分页链接,另一个返回带页码的分页链接,但是这两种分页链接页码都是以带问号的动 ...