本文始发于我的公众号:TechFlow,原创不易,求个关注web
今天是pandas数据处理专题的第5篇文章,咱们来聊聊pandas的一些高级运算。编程
在上一篇文章当中,咱们介绍了panads的一些计算方法,好比两个dataframe的四则运算,以及dataframe填充Null的方法。今天这篇文章咱们来聊聊dataframe中的广播机制,以及apply函数的使用方法。api
广播机制咱们其实并不陌生, 咱们在以前介绍numpy的专题文章当中曾经介绍过广播。当咱们对两个尺寸不一致的数组进行运算的时候,系统会自动将其中维度较小的那个填充成和另一个同样再进行计算。数组
好比咱们将一个二维数组减去一个一维数组,numpy会先将一位数组拓展到二维以后再进行减法运算。看起来就像是二维数组的每一行分别减去了这一个一维数组同样。能够理解成咱们将减去这一个一维数组的操做广播到了二维数组的每一行或者是每一列当中。app
在上面这个例子当中咱们建立了一个numpy的数组,而后减去了它的第一行。咱们对比下最后的结果会发现,arr数组当中的每一行都减去了它的第一行。编辑器
一样的操做在dataframe也同样能够进行。函数式编程
咱们固然也能够对某一列进行广播,可是dataframe四则运算的广播机制默认对行生效,若是要对列使用的话,咱们须要使用算术运算方法,而且指定但愿匹配的轴。函数
pandas的另一个优势是兼容了numpy当中的一些运算方法和函数,使得咱们也能够将一些numpy当中的函数运用在DataFrame上,这样就大大拓展了使用方法以及运算方法。flex
好比咱们要将DataFrame当中全部的元素变成它的平方,咱们利用numpy的square方法能够很容易作到:spa
咱们能够将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 -