本次的 Python學(xué)習(xí)教程是關(guān)于Python數(shù)據(jù)分析實(shí)戰(zhàn)基礎(chǔ)相關(guān)內(nèi)容,本文主要講的是Pandas中 第二好用的函數(shù)——謙虛的 apply。
創(chuàng)新互聯(lián)公司總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站維護(hù)、公眾號(hào)搭建、小程序開發(fā)、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動(dòng)行銷領(lǐng)域創(chuàng)造價(jià)值而不懈努力!
為什么說第二好用呢?那第一呢?秉承這謙虛使人進(jìn)步,驕傲使人落后的品質(zhì),apply選擇做一個(gè)謙虛又優(yōu)雅的函數(shù)。
我們單獨(dú)用一篇來為apply樹碑立傳,原因有二,一是因?yàn)閍pply函數(shù)極其 靈活高效,甚至是重新定義了pandas的靈活,一旦熟練運(yùn)用,在數(shù)據(jù)清洗和分析界可謂是“屠龍?jiān)谑?,天下我有”;二是apply概念 相對(duì)晦澀,需要結(jié) 合具體案例去咀嚼和實(shí)踐。附上一份 Python學(xué)習(xí)路線圖,跟著走,不會(huì)錯(cuò)!
Apply初體驗(yàn)
apply函數(shù),因?yàn)樗偸呛头纸M函數(shù)一起出現(xiàn),所以在江湖得了個(gè)“groupby伴侶”的稱號(hào)。她的主要作用是做 聚合運(yùn)算,以及在分組基礎(chǔ)上根據(jù)實(shí)際情況來 自定義一些規(guī)則,常見用法和參數(shù)如下:
如果把源數(shù)據(jù)比作面粉,groupby分組就是把面粉揉成一個(gè)個(gè)面團(tuán)的過程,apply起到的作用,是 根據(jù)數(shù)據(jù)需求來調(diào)餡,并且把每一個(gè)面團(tuán)包成我們喜歡的菜包。其實(shí)之前的Python學(xué)習(xí)教程有跟大家提過apply的相關(guān)介紹。接下來,我們通過兩個(gè)場(chǎng)景,更深入的感受下apply函數(shù)的優(yōu)雅迷人。
場(chǎng)景一
背景:我們拿到了一份4位同學(xué)三次模擬考試的成績(jī),想知道每位同學(xué)歷次模擬中最好成績(jī)和最差成績(jī)分別是多少。
思路:最好和最差,分別對(duì)應(yīng)著max與min,我們先按姓名分組,再用apply函數(shù)返回對(duì)應(yīng)的最大和最小值,最終將結(jié)果合并。
先導(dǎo)入源數(shù)據(jù):
看一看每位同學(xué)最高成績(jī):
我們指定“綜合成績(jī)”列,然后把max函數(shù)直接傳入apply參數(shù)內(nèi),返回了對(duì)應(yīng)分組內(nèi)成績(jī)的最大值。有一些常見函數(shù),如max、min、len等函數(shù)可以直接傳入apply。
groupby分組默認(rèn)會(huì)把分組依據(jù)列(姓名)變成索引,這里用reset_index方法重置或者說取消姓名索引,將它保留在列的位置,維持DataFrame格式,方便后續(xù)匹配。
再篩選出最低成績(jī):
兩張表按姓名合并:
得到了我們預(yù)期的結(jié)果,只是列名略丑,可以用.columns方法來賦值更改。場(chǎng)景一比較死板和嚴(yán)肅,場(chǎng)景二我們換個(gè)更接地氣的風(fēng)格。
場(chǎng)景二
背景:Boss丟過來一份省市銷售表,里面包含省份、城市、最近1個(gè)月銷售額3個(gè)字段,沒等你開口問需求,Boss就開腔了:“小Z啊,我最近對(duì)3這個(gè)數(shù)字有執(zhí)念,我想看看每個(gè)省份銷售排名第3的都是哪些城市,以及他們的銷售額情況。對(duì)了,這個(gè)需求要盡快!”
思路:?jiǎn)栴}的關(guān)鍵是 找到每個(gè)省份銷售排名第3的城市,首先,應(yīng)該對(duì)省份、城市按銷售額進(jìn)行降序排列,然后,找到對(duì)應(yīng)排名第3的城市,Emmm,如果是排名第1的城市,我們可以通過排序后去重實(shí)現(xiàn),但是這個(gè)排名第3,小Z瘋狂撓頭,還是沒有什么思路。
于是弱弱的請(qǐng)求寬限時(shí)間:“領(lǐng)導(dǎo),我覺得這個(gè)需求可能要花多一些時(shí)間,因?yàn)?..”
“我不要你覺得!我要我覺得!現(xiàn)在是17:00,我覺得半個(gè)小時(shí)時(shí)間已經(jīng)夠充裕了!”Boss放下了手中的《明學(xué)是怎樣煉成的》,語(yǔ)氣斬釘截鐵又毋庸置疑。
小Z在無奈和絕望之中,想起了那句詩(shī)“假如數(shù)據(jù)清洗難住了你,不要悲傷,不要心急,憂郁的日子里需要apply”,一瞬間通透了。
說干就干,先導(dǎo)入數(shù)據(jù)源,對(duì)數(shù)據(jù)做個(gè)初步了解:
數(shù)據(jù)源有省份、城市、近1月銷售額3個(gè)字段,一共210行(銷售額)亂序排列,且都沒有空值,整體比較規(guī)整。
要得到銷售排名第3的城市,要先進(jìn)行排序,這里我們用省份、近1月銷售額兩個(gè)關(guān)鍵字段進(jìn)行降序排列,得到我們期待的順序:
接著,在apply函數(shù)登場(chǎng)前,我們先詳細(xì)剖析一下整個(gè)過程:
apply的精髓,在于 揉面和 DIY(調(diào)餡)菜包。我們需要把源數(shù)據(jù)(面粉)給揉成一個(gè)個(gè)面團(tuán),再把一個(gè)個(gè)面團(tuán)DIY成我們想要口味的菜包。其中, 揉面的過程就是groupby分組,而 DIY調(diào)餡做菜包就是apply自定義函數(shù)和應(yīng)用的過程。
結(jié)合我們的目標(biāo),揉面是按省份進(jìn)行分組,得到每個(gè)省各個(gè)城市和對(duì)應(yīng)銷售額的面團(tuán);DIY菜包是在每個(gè)面團(tuán)中取其第三名的城市和銷售額字段。
第一步分組非常簡(jiǎn)單,按省份分組即可。而取第3名的城市和銷售,表明我們需要城市和銷售兩個(gè)字段,所以在分組后指明這兩列:
這一步,我們已經(jīng)揉好了面,原始的面團(tuán)也初步成型,雖然返回的結(jié)果有點(diǎn)晦澀,但是我們可以在腦海中構(gòu)建一下這些面團(tuán),截圖只展示了部分:
要把這些面團(tuán)包成菜包,就是要我們?nèi)〕雒恳粋€(gè)面團(tuán)中,排名第3的城市。有個(gè)問題需要注意,有一些直轄市是和省并列的,而作為城市只有單獨(dú)的一行,這樣的城市我們就默認(rèn)返回其本身的數(shù)據(jù);對(duì)于非直轄市省份來說,就需要定位篩選。
拿x2來舉例,要找到這個(gè)面團(tuán)中排名第三的城市和銷售額,應(yīng)該怎么做呢?答案是直接索引,把他看作是一個(gè)DataFrame格式的表,要選取第3行的所有值,包括城市和銷售額,這里用iloc索引,很簡(jiǎn)單的一行代碼:
下面把我們針對(duì)直轄市的判斷和非直轄市的篩選邏輯整合成一個(gè)函數(shù):
這個(gè)函數(shù),將會(huì)在apply的帶領(lǐng)下,對(duì)每一個(gè)分組進(jìn)行批量化DIY,抽取出排名第3的城市和銷售額,應(yīng)用起來很簡(jiǎn)單:
至此,每個(gè)省份,銷售額排名第三的城市已經(jīng)成功篩選出來。回顧整個(gè)操作流程,先排序,后分組,最后通過定義函數(shù)傳入apply,提取出我們的目標(biāo)值。 分組后數(shù)據(jù)的抽象形態(tài),以及如何判斷和取出我們需要的值,是解決問題的關(guān)鍵和難點(diǎn)。
“報(bào)告老板!篩選任務(wù)已經(jīng)完成!”apply在握,底氣十足呀!
更多的 Python學(xué)習(xí)教程也會(huì)繼續(xù)為大家更新,也希望大家學(xué)Python的時(shí)候跟著 Python學(xué)習(xí)路線圖走,有一個(gè)明確的知識(shí)體系梳理,學(xué)的時(shí)候不至于會(huì)毫無頭緒。