原标题:Pandas中第二好用的函数 | 优雅的apply

这是Python数据分析实战基础的第四篇内容,也是基础系列的最后一篇,接下来就进入实战系列了。本文主要讲的是Pandas中第二好用的函数——apply。

为什么说第二好用呢?做人嘛,最重要的就是谦虚,做函数也是一样的,而apply就是这样一个优雅而谦虚的函数。

我们单独用一篇来为apply树碑立传,原因有二,一是因为apply函数极其灵活高效,甚至是重新定义了pandas的灵活,一旦熟练运用,在数据清洗和分析界可谓是“屠龙在手,天下我有”;二是apply概念相对晦涩,需要结合具体案例去咀嚼和实践。

Apply初体验

apply函数,因为她总是和分组函数一起出现,所以在江湖得了个“groupby伴侣”的称号。她的主要作用是做聚合运算,以及在分组基础上根据实际情况来自定义一些规则,常见用法和参数如下:

如果把源数据比作面粉,groupby分组就是把面粉揉成一个个面团的过程,apply起到的作用,是根据数据需求来调馅,并且把每一个面团包成我们喜欢的包子。接下来,我们通过两个场景,更深入的感受下apply函数的优雅迷人。

场景一

背景:我们拿到了一份4位同学三次模拟考试的成绩,想知道每位同学历次模拟中最好成绩和最差成绩分别是多少。

思路:最好和最差,分别对应着max与min,我们先按姓名分组,再用apply函数返回对应的最大和最小值,最终将结果合并。

先导入源数据:

看一看每位同学最高成绩:

我们指定“综合成绩”列,然后把max函数直接传入apply参数内,返回了对应分组内成绩的最大值。有一些常见函数,如max、min、len等函数可以直接传入apply。

groupby分组默认会把分组依据列(姓名)变成索引,这里用reset_index方法重置或者说取消姓名索引,将它保留在列的位置,维持DataFrame格式,方便后续匹配。

再筛选出最低成绩:

两张表按姓名合并:

得到了我们预期的结果,只是列名略丑,可以用.columns方法来赋值更改。场景一比较死板和严肃,场景二我们换个更接地气的风格。

场景二

背景:Boss丢过来一份省市销售表,里面包含省份、城市、最近1个月销售额3个字段,没等你开口问需求,Boss就开腔了:“小Z啊,我最近对3这个数字有执念,我想看看每个省份销售排名第3的都是哪些城市,以及他们的销售额情况。对了,这个需求要尽快!”

思路:问题的关键是找到每个省份销售排名第3的城市,首先,应该对省份、城市按销售额进行降序排列,然后,找到对应排名第3的城市,Emmm,如果是排名第1的城市,我们可以通过排序后去重实现,但是这个排名第3,小编疯狂挠头,还是没有什么思路。

于是弱弱的请求宽限时间:“领导,我觉得这个需求可能要花多一些时间,因为...”

“我不要你觉得!我要我觉得!现在是17:00,我觉得半个小时时间已经够充裕了!”Boss放下了手中的《明学是怎样炼成的》,语气斩钉截铁又毋庸置疑。

小编在无奈和绝望之中,想起了那句诗“假如数据清洗难住了你,不要悲伤,不要心急,忧郁的日子里需要apply”,一瞬间通透了。

说干就干,先导入数据源,对数据做个初步了解:

数据源有省份、城市、近1月销售额3个字段,一共210行(销售额)乱序排列,且都没有空值,整体比较规整。

要得到销售排名第3的城市,要先进行排序,这里我们用省份、近1月销售额两个关键字段进行降序排列,得到我们期待的顺序:

接着,在apply函数登场前,我们先详细剖析一下整个过程:

apply的精髓,在于揉面和DIY(调馅)包子。我们需要把源数据(面粉)给揉成一个个面团,再把一个个面团DIY成我们想要口味的包子。其中,揉面的过程就是groupby分组,而DIY调馅做包子就是apply自定义函数和应用的过程。

结合我们的目标,揉面是按省份进行分组,得到每个省各个城市和对应销售额的面团;DIY包子是在每个面团中取其第三名的城市和销售额字段。

第一步分组非常简单,按省份分组即可。而取第3名的城市和销售,表明我们需要城市和销售两个字段,所以在分组后指明这两列:

这一步,我们已经揉好了面,原始的面团也初步成型,虽然返回的结果有点晦涩,但是我们可以在脑海中构建一下这些面团,截图只展示了部分:

要把这些面团包成包子,就是要我们取出每一个面团中,排名第3的城市。有个问题需要注意,有一些直辖市是和省并列的,而作为城市只有单独的一行,这样的城市我们就默认返回其本身的数据;对于非直辖市省份来说,就需要定位筛选。

拿x2来举例,要找到这个面团中排名第三的城市和销售额,应该怎么做呢?答案是直接索引,把他看作是一个DataFrame格式的表,要选取第3行的所有值,包括城市和销售额,这里用iloc索引,很简单的一行代码:下面把我们针对直辖市的判断和非直辖市的筛选逻辑整合成一个函数:

这个函数,将会在apply的带领下,对每一个分组进行批量化DIY,抽取出排名第3的城市和销售额,应用起来很简单:

至此,每个省份,销售额排名第三的城市已经成功筛选出来。回顾整个操作流程,先排序,后分组,最后通过定义函数传入apply,提取出我们的目标值。分组后数据的抽象形态,以及如何判断和取出我们需要的值,是解决问题的关键和难点。

“报告老板!筛选任务已经完成!”apply在握,小编底气变得格外的足。

后台回复【社群】

即可加入数据分析交流群

2000+数据行业小伙伴都在这里~!返回搜狐,查看更多

责任编辑:

apply筛选 pandas_Pandas中第二好用的函数 | 优雅的apply相关推荐

  1. Pandas 中第二好用的函数是?

    作者 | 周志鹏 责编 | 刘静 这是Python数据分析实战基础的第四篇内容,也是基础系列的最后一篇,接下来就进入实战系列了.本文主要讲的是Pandas中第二好用的函数--apply. 为什么说第二 ...

  2. apply筛选 pandas_更快的pandas.apply搜索方法

    python3中的字典类型用了哈希排列,速度很快.到底有多快呢. 最近写数据分析代码,有一个筛选程序,在使用pandas.apply的过程中,在apply过程中使用了loc函数,速度很慢.为了提高速度 ...

  3. Kotlin 中的 run、let、with、apply、also、takeIf、takeUnless 语法糖使用和原理分析

    这些Kotlin的语法糖函数经常用,但也很容易搞混,所以转载一下,若混了可以回来再看 转载自公众号:纸上浅谈 正文: 在 Kotlin 有一些可以简化代码的语法糖,比如 run.let.with.ap ...

  4. ES6/03/函数的定义方式和调用方式,函数内的this指向,改变函数中this指向的三个方法(call(),apply(),bind())

    函数的定义方式 1,自定义函数(命名函数) function fun(){}; 2,函数表达式(匿名函数) var fun =function(){}; 3,利用new Function( '参数1' ...

  5. excel自动筛选_在Excel自动筛选器中隐藏箭头

    excel自动筛选 When you turn on the filter in an Excel worksheet list, or if you create a named Excel tab ...

  6. 筛选df中某列重复值的索引

    DataFrame数据 import pandas as pd data = {'year': ['2018', '2019', '2016', '2012', '2013', '2016','201 ...

  7. python之筛选图像中是否存在黑白背景

    python之筛选图像中是否存在黑白背景 紧接上篇文章的需求,需要进行功能增加 某些图片存在背景丢失问题,出现黑白背景现象,这种需要排查,同样交给了自动化处理. 这次不比上次了,我搜罗了一堆资料,全是 ...

  8. 编写一个SQL查询,获取Employee表中第二高的薪水(Salary)

    单选 class X{Y y=new Y();public X(){System.out.print("X");} } class Y{public Y(){System.out. ...

  9. pandas基于dataframe字符串数据列不包含特定字符串来筛选dataframe中的数据行(rows where values do not contain substring)

    pandas基于dataframe字符串数据列不包含(not contains)特定字符串来筛选dataframe中的数据行(rows where values do not contain subs ...

最新文章

  1. 过滤请求绝技,布隆过滤器与布谷鸟过滤器
  2. 亲试虚拟机为REDHAT5装VM-tool
  3. Eclipse如何调整字体大小
  4. boost::posix_time模块用时间构造和计算的一些简单例子
  5. 敲黑板嘞!一文彻底搞懂 Python 生成器!
  6. python回顾(九)——函数高级,递归函数,匿名函数
  7. Socket编程:必须要了解的网络字节序和转换函数
  8. 在哪里定义_创意设计学院举办设计从哪里来,到哪里去”专题讲座
  9. 纠偏的意思_承压能力和纠偏能力,决定成长的高度
  10. 添加javascript代码:_JavaScript(1)
  11. Python按元组中第一个字符串升序第二个字符串降序排序
  12. 通过Shiny app实现疫苗预防疾病的过程
  13. mybatis自增主键回填
  14. 【apache】phpstudy中apache 隐藏入口文件index.php (解决no input file specified错误)
  15. 原生Android开发自学过程(二)之TextView基础属性
  16. Hadoop面试题整理(1)
  17. 考研词汇5500+地名
  18. 服务器虚拟化的重要性,服务器虚拟化:虚拟机迁移的重要性
  19. WEB安全全基础漏洞学习
  20. java数组列表和数组的区别_数组,集合,列表的使用与区别

热门文章

  1. 4,list,list的列表嵌套,range
  2. centos7快速搭建LAMP
  3. 使用阿里云配置管理ACM实现zookeeper依赖服务的透明Failover迁移
  4. 理解Kubernetes(2): 应用的各种访问方式
  5. 【HTTP】图解HTTPS
  6. 《IT咨询指南》读书笔记一开卷 前言
  7. Scala swing和FX
  8. 基于Springboot实现共享自习室管理系统
  9. Jsp实现网上定餐系统
  10. Kfold交叉验证心得