Pandas 中第二好用的函數是?

2021-01-11 CSDN

作者 | 周志鵬

責編 | 劉靜

這是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,小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在握,小Z底氣變得格外的足。

作者:周志鵬,2年數據分析,深切感受到數據分析的有趣和學習過程中缺少案例的無奈,遂新開公眾號「數據不吹牛」,定期更新數據分析相關技巧和有趣案例(含實戰數據集),歡迎大家關注交流。

聲明:本文為作者投稿,版權歸作者個人所有。

相關焦點

  • 盤點Pandas 的100個常用函數
    作者 | 劉順祥 來源 | 數據分析1480 這一期將分享我認為比較常規的100個實用函數,這些函數大致可以分為六類,分別是統計匯總函數、數據清洗函數、數據篩選、繪圖與元素級運算函數、時間序列函數和其他函數。統計匯總函數數據分析過程中,必然要做一些數據的統計匯總工作,那麼對於這一塊的數據運算有哪些可用的函數可以幫助到我們呢?
  • Pandas transform函數
    Pandas是一個很有用的庫,它包含了大量用於操作數據的內置函數。其中,transform()在處理行或列時非常有用。在本文中,我們將介紹以下最常用的Pandas transform()用途:轉換值組合groupby()過濾數據在組級別處理缺失值請查看我的Github repo以獲取原始碼;https://github.com/BindiChen/machine-learning/blob/master/data-analysis/013-pandas-transform/pandas-transform.ipynb
  • Pandas 數據處理|Datetime 時間模塊在 Pandas 中的使用
    Datatime 作為 Python 中的時間模塊類型,處理時間有關數據是非常方便的, Pandas 作為數據分析程序包同樣也支持 DataTime 數據機制,例如1,函數 to_datetime() 將數據列表中的 Series 列轉化為 datetime 類型,#Convert the type to datetimeapple.Date =
  • 數據處理必看:如何讓你的 pandas 循環加快 71803 倍
    python 不能用任何內置函數,而且速度非常慢。在我們的示例中,我們得到了一個具有 65 列和 1140 行的數據幀,它包含 2016-2019 賽季的足球比賽結果。我們要創建一個新的列來指示某個特定的隊是否打過平局。
  • Pandas 必知必會的使用技巧,值得收藏!
    本期的主題是關於python的一個數據分析工具pandas的,歸納整理了一些工作中常用到的pandas使用技巧,方便更高效地實現數據分析。[df.groupby(['Mt']).apply(lambda x: x['Count'].idxmax())] 先按Mt列進行分組,然後對分組之後的數據框使用idxmax函數取出Count最大值所在的列,再用iloc位置索引將行取出。
  • World's only all-white panda's new gilded look!
    Only when the parent pandas both carry the gene can the baby show the albino traits.Albinism usually does not affect the animal's physical makeup and functions.
  • 關於Numpy和Pandas axis的理解
    在機器學習中我們常常處理幾十維的數據,對於機器學習常用的Numpy庫,當我們賦予二維數組每一行一個值的時候,那麼此時二維數組的列數就是多維空間的維度。每一行給的值通常是我們的樣本值,它也是損失函數準確度的一個依據。
  • PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包
    這篇文章將介紹一種在pandas的dataframe中使用SQL的python包,並且使用一個不等連結的查詢操作來介紹PandasSQL的使用方法。不等連接(Non-equi join)假設你必須連接兩個dataframe。其中一個顯示了我們對某些商品進行促銷的時間段。第二個是事務Dataframe。
  • 懂Excel輕鬆入門Python數據分析包pandas(二十七):IF函數代替者
    後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandasnumpy.where 方法Excel 函數中有一個初學者都能馬上學會的函數——IF 函數,而在 pandas 中卻沒有對應效果的方法,這是因為 numpy 已經有了對應的實現—— where。他能根據條件(true 或者 false) 返回不同的值。
  • Pandas GUI:如何輕鬆獲取Pandas數據幀?
    這些庫本質上是在hood中運行Pandas的功能,如SweetViz和Pandas profiling庫。· 基於GUI的Pandas替代品,如Bamboolib。最近,筆者發現了另一個基於GUI的Pandas替代,叫做PandasGUI。它具有繪製數據幀以及重新構建數據幀的功能,用戶也可以進行任意自定義操作。本文將介紹它的各種功能以及在數據中使用的方法。
  • 英語小作文:Pandas 熊貓
    新東方網>英語>英語學習>英語寫作>中小學英語作文>正文英語小作文:Pandas 熊貓 2013-01-15 17:29 來源:恆星英語 作者:
  • 小學英語作文:Pandas went visiting the park
    新東方網>英語>英語學習>英語寫作>中小學英語作文>正文小學英語作文:Pandas went visiting the park 2013-01-16 14:35 來源:恆星英語 作者:
  • Pandas Rub Themselves in Horse Manure to Feel Warm, Study Finds
    Researchers recorded 38 instances of wild giant pandas interacting
  • Python數據處理包,pandas 乾貨知識,關於軸的理解
    前言axis 表示軸,是處理多維數據時用於表示維度方向的概念,在 pandas 中大部分的方法都有 axis 參數,因為 pandas 需要調用者告訴他,需要處理的是哪個維度的數據。本文將分享我對 axis 的理解,希望幫助你更好理解 axis 的概念,這些概念不僅僅應用在 pandas ,同樣適合於其他相關的庫的理解(如 numpy 中的3維或以上的處理)。
  • Python:將XML數據存儲到Pandas DataFrame中
    XML在各種程序中用於構造、存儲和傳輸數據。在這篇文章中,我們將討論如何使用python xml庫中的 「ElementTree」模塊來解析xml數據並將數據存儲在panda DataFrame中。首先,讓導入Python庫:import pandas as pdfrom xml.etree.ElementTree import parse現在,讓我們看一下'books.xml'文件中的標籤:我們可以通過將文件名傳遞給'parse()'方法來定義'XML'文檔對象:document = parse('books.xml')
  • python時間序列分析之_用pandas中的rolling函數計算時間窗口數據
    簡介由於系統編輯器限制,代碼行用無序列表表示。上篇文章中,我們講解了如何對時間數據進行重採樣及重採樣中降採樣和升採樣的概覽和使用方法,通過重採樣我們可以得到任何想要頻率的數據,但是這些數據也是一個時點的數據,那麼就存在這樣一個問題:時點的數據波動較大,某一點的數據不能很好的表現它本身的特性,於是我們就想,能否用一個區間的的數據去表現呢,這樣數據的準確性是不是更好一些呢?
  • Panda, a chubby angel of friendship
    Accordingly, as the lebensraum of pandas getting smaller, there was a time when pandas and saber-toothed tigers compete for food.
  • 用Python 做數據處理必看:12 個使效率倍增的 Pandas 技巧
    Apply把函數應用於數據框的特定行/列之後返回一些值。這裡的函數既可以是系統自帶的也可以是用戶定義的。例如,此處可以用它來尋找每行每列的缺失值個數:輸出結果:由此我們得到了想要的結果。注意:第二個輸出使用了head()函數,因為數據包含太多行。
  • Pandas0.25來了,別錯過這10大好用的新功能
    下面和大家一起看看新版 pandas 都有哪些改變。四個置頂的警告從 0.25 起,pandas 只支持 Python 3.53 及以上版本了,不再支持 Python 2.7,還在使用 Python 2 的朋友可要注意了,享受不了新功能了,不過,貌似用 Python 2 做數據分析這事兒估計已經絕跡了吧!
  • 20個Pandas函數詳解
    它提供了許多函數和方法來加快數據分析過程。pandas之所以如此普遍,是因為它具有強大的功能,以及他簡單的語法和靈活性。在這篇文章中,我將舉例來解釋20個常用的pandas函數。有些是很常見的,我敢肯定你以前用過。有些對你來說可能是新的。所有函數都將為你的數據分析過程增加價值。