Python学习教程:Pandas中第二好用的函数
从网上看到一篇好的文章是关于如何学习python数据分析的迫不及待想要分享给大家,大家也可以点链接看原博客。希望对大家的学习有帮助。
本次的Python学习教程是关于Python数据分析实战基础相关内容,本文主要讲的是Pandas中第二好用的函数——谦虚的apply。
为什么说第二好用呢?那第一呢?秉承这谦虚使人进步,骄傲使人落后的品质,apply选择做一个谦虚又优雅的函数。
我们单独用一篇来为apply树碑立传,原因有二,一是因为apply函数极其灵活高效,甚至是重新定义了pandas的灵活,一旦熟练运用,在数据清洗和分析界可谓是“屠龙在手,天下我有”;二是apply概念相对晦涩,需要结合具体案例去咀嚼和实践。附上一份Python学习路线图,跟着走,不会错!
Apply初体验
apply函数,因为她总是和分组函数一起出现,所以在江湖得了个“groupby伴侣”的称号。她的主要作用是做聚合运算,以及在分组基础上根据实际情况来自定义一些规则,常见用法和参数如下:

如果把源数据比作面粉,groupby分组就是把面粉揉成一个个面团的过程,apply起到的作用,是根据数据需求来调馅,并且把每一个面团包成我们喜欢的包子。其实之前的Python学习教程有跟大家提过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,小Z疯狂挠头,还是没有什么思路。
于是弱弱的请求宽限时间:“领导,我觉得这个需求可能要花多一些时间,因为...”

“我不要你觉得!我要我觉得!现在是17:00,我觉得半个小时时间已经够充裕了!”Boss放下了手中的《明学是怎样炼成的》,语气斩钉截铁又毋庸置疑。
小Z在无奈和绝望之中,想起了那句诗“假如数据清洗难住了你,不要悲伤,不要心急,忧郁的日子里需要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在握,底气十足呀!
更多的Python学习教程也会继续为大家更新,也希望大家学Python的时候跟着Python学习路线图走,有一个明确的知识体系梳理,学的时候不至于会毫无头绪。
转载文章链接:https://www.360kuai.com/pc/91acdab11711e76da?cota=3&kuai_so=1&sign=360_57c3bbd1&refer_scene=so_1
Python学习教程:Pandas中第二好用的函数的更多相关文章
- Python学习教程(Python学习视频_Python学些路线):Day06 函数和模块的使用
Python学习教程(Python学习视频_Python学些路线):函数和模块的使用 在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解. $$x_1 + x_2 + x ...
- Python 学习教程汇总
Python快速教程http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html简明Python教程https://bop.molun.ne ...
- Python学习教程(十)精选 TOP45 值得学习的Python项目
精选 TOP45 值得学习的Python项目 [导读]热门资源博客 Mybridge AI 比较了 18000 个关于 Python 的项目,并从中精选出 45 个最具竞争力的项目.我们进行了翻译,在 ...
- Python 基础教程 —— Pandas 库常用方法实例说明
目录 1. 常用方法 pandas.Series 2. pandas.DataFrame ([data],[index]) 根据行建立数据 3. pandas.DataFrame ({dic}) ...
- Python学习笔记6-Python中re(正则表达式)模块学习
今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的资料.这里主要介绍Python中常用的正则表达式处理函数. re.match re.match 尝试从 ...
- Python学习教程(一)自学资源分享
Python 可以用来做什么? 在我看来,基本上可以不负责任地认为,Python 可以做任何事情.无论是从入门级选手到专业级选手都在做的爬虫,还是Web 程序开发.桌面程序开发还是科学计算.图像处理, ...
- 改写《python基础教程》中的一个例子
一.前言 初学python,看<python基础教程>,第20章实现了将文本转化成html的功能.由于本人之前有DIY一个markdown转html的算法,所以对这个例子有兴趣.可仔细一看 ...
- Python学习之路【第二篇】-pyc简介、Python常用的数据类型及其用法和常用运算符
1.pyc简介 python程序在运行时也有编译过程,编译后会产生.pyc文件.这是一种由python虚拟机执行的二进制文件(字节码),用于保存内存中PyCodeObject,以便加快程序的加载运行. ...
- python学习教程,史上最全面的python学习路线图
Python 是Web 开发.游戏脚本.计算机视觉.物联网管理和机器人开发的主流语言之一,随着Python用户可以预期的增长,它还有机会在多个领域里登顶.Python学习路线分享给你. 阶段一是Pyt ...
随机推荐
- VUE: 移动端长按弹出确认删除地址(后面测试发现IOS有BUG,后面有更新随笔,更新后的亲测有效)
收货地址的删除方式可能有很多种,我目前见过的暂时只有两种(1.在编辑页删除 2.长按某一条收货地址弹出是否删除地址) 在开发的项目上要求第二种删除方法,于是记录一下我写的代码 ~ 1.首先,在移动端 ...
- app 移动支付
1.微信 多个端单独对用appid 多个appid 对应到一个商户 先创建appid 然后再关联商户 2.支付宝 多个aliPrivateKey,这个可以生成pkcs8,是用在java里面.非 ...
- oracle rowtype
v_customer customerinfo%rowtype; select * into v_customer from customerinfo where guid = v_loan.cust ...
- MessagePack Java 0.6.X 可选字段
你可添加一个新的字段来保持可用性.在新字段中使用 @Optional 注解. @Message public static class MyMessage { public String na ...
- 线性素数筛(欧拉筛)(超级好的MuBan)
Problem:找出小于等于n的所有素数的个数. #include <bits/stdc++.h> using namespace std; const int maxn = 1e6; i ...
- go基本使用
一.第一个go语言程序 1.新建一个go项目:File--New--Progect 2.新建一个Go文件:File--New--Go File 3.在编辑区内写入下列代码: package main ...
- vue添加外部js
1.新建节点 const s = document.createElement("script"); 2.设置节点属性 s.type = "text/javascript ...
- 微信小程序_(校园视)开发上传视频业务
微信小程序_(校园视) 开发用户注册登陆 传送门 微信小程序_(校园视) 开发上传视频业务 传送门 微信小程序_(校园视) 开发视频的展示页-上 传送门 微信小程序_(校园视) 开发视频的展示页-下 ...
- vue 的多页面应用
vue-cli3 中构建多页面的应用 第一步:先创建一个 vue-cli3 的项目:vue create app 然后运行项目:npm run serve 现在开始多页面的应用: 首先在 src 的目 ...
- itertools模块中的product方法
itertools模块中的product方法 itertools.product(*iterables[, repeat]) 笛卡尔积 创建一个迭代器,生成表示item1,item2等中的项目的笛卡尔 ...