Pandas的函數應用及映射方法

2021-01-11 CDA數據分析師

CDA數據分析師 出品

在數據分析師日常的數據清洗工作中,經常需要對數據進行各種映射變換,通過Pandas可以非常方便地解決此問題,其提供了map()、apply()、mapapply()等方法,下面將一一詳細介紹這三個映射函數的用法及三者的區別。

1. map( )

map方法主要是運用在Series中,用來對Series中的元素進行轉化。其語法及參數說明如下:

語法:se.map(arg, na_action=None)

參數說明:

· arg:函數、字典或序列對應的映射

· na_action: 是否忽略NA,默認None

當傳入參數arg為序列時,會將傳入的序列中與原序列value相匹配的key,所對應的value映射到原序列的value中。

# 根據指定序列進行一一映射<<< se1 =pd.Series({'a':1,'b':2,'c':3,'d':4})<<< se1a 1b 2c 3d 4dtype: int64<<< se2 =pd.Series({1:11,2:22,3:33,4:44})<<< se21 112 223 334 44dtype: int64<<< se1.map(se2)a 11b 22c 33d 44dtype: int64

將以上操作分解為兩步來理解:

第一步:將序列se1中的value與序列se2中的key進行匹配。

第二步:將序列se2中key對應的value映射到序列se1中的value

當傳入的參數arg為字典時,返回一個根據字典的映射關係對原序列的value進行轉換的新序列。

# 根據指定字典進行一一映射<<< se =pd.Series({'a':1,'b':2,'c':3,'d':4})<<< sea 1b 2c 3d 4dtype: int64<<< dic={1:11,2:22,3:33,4:44}<<< dic{1: 11, 2: 22, 3: 33, 4: 44}<<< se.map(dic)a 11b 22c 33d 44dtype: int64

當傳入的參數arg為 函數時,會對原序列中每個元素運用該函數,並返回與原序列個數一致,index一致的新序列。運用的函數可以是numpy中的函數,也可以是匿名函數或自定義的函數。

· 直接使用numpy的函數

# 根據指定函數進行一一映射<<< se=pd.Series({'a':-1,'b':2,'c':-3,'d':4})<<< sea -1b 2c -3d 4dtype: int64# 直接使用numpy的函數,不常用 <<< se.map(np.abs)a 1b 2c 3d 4dtype: int64# 直接對Series運用numpy函數效果一致<<< se.abs()a 1b 2c 3d 4dtype: int64

· 使用匿名函數

# 使用匿名函數<<< se =pd.Series({'a':1,'b':2,'c':3,'d':4})<<< sea 1b 2c 3d 4dtype: int64<<< se.map(lambda x:x**2)a 1b 4c 9d 16dtype: int64

· 使用自定義函數

# 使用匿名函數<<< def fun(x): x=x**2 return x<<< se.map(fun)a 1b 4c 9d 16dtype: int64

2. apply( )

apply()是pandas中使用頻率特別高的一種方法,需要重點掌握。apply()方法不僅可以和map()方法一樣,得到一個對元素進行轉換後相同大小的結果數組,還可以得到一個通過函數進行匯總的標量值。其語法及參數說明如下:

語法:df.apply(['func', 'axis=0', 'broadcast=None', 'raw=False', 'reduce=None', 'result_type=None', 'args=()', 'kwds'],)**

重要參數說明:

· func:對對象操作的函數,可以是numpy中的函數,也可以是匿名函數或自定義的函數

· axis:當輸入對象為dataframe時運算依據的軸,0為將函數作用於每列,1為將函數作用於每行,默認None

當輸入對象為Series時,apply()會將函數作用於對象中的每個值,效果與map()方法完全一致。

<<< se =pd.Series({'a':1,'b':2,'c':3,'d':4})<<< sea 1b 2c 3d 4# 對序列se的每個值進行開平方操作<<< se.apply(np.sqrt)a 1.000000b 1.414214c 1.732051d 2.000000dtype: float64

當輸入對象為DataFrame時,apply()方法的作用對象為每一行或者每一列數據,若axis為0,即函數作用於每列數據;若axis為1,即函數作用於每行數據。

<<< df = pd.DataFrame(np.arange(16).reshape(4,4), columns=['A','B','C','D'])<<< df A B C D0 0 1 2 31 4 5 6 72 8 9 10 113 12 13 14 15# 對dataframe根據每列求和<<< df.apply(np.sum)A 24B 28C 32D 36dtype: int64 # 對dataframe根據每行求平均值<<< df.apply(np.mean,axis=1)0 1.51 5.52 9.53 13.5dtype: float64

和map()方法一樣,apply()中運用的函數可以是上例所示numpy中的函數,也可以是匿名函數或自定義的函數。

# 使用匿名函數對dataframe進行操作<<< df.apply(lambda x:x**2) A B C D0 0 1 4 91 16 25 36 492 64 81 100 1213 144 169 196 225# 使用自定義函數對dataframe進行操作<<< def fun(x): x=x**2 return x<<< df.apply(fun) A B C D0 0 1 4 91 16 25 36 492 64 81 100 1213 144 169 196 225

3. applymap( )

上面apply()方法主要是對dataframe數據的行或列進行操作,但如果我們想對datafram數據中的每個元素進行操作,而不進行匯總,該怎麼實現呢?

pandas提供的另一個映射函數mapapply(),則能實現將函數運用在元素級別。其語法及參數說明如下:

語法:df.applymap(func)

參數說明:

· func :對元素進行操作的函數

applymap()方法只運用於dataframe數據中,對dataframe數據中的每一元素進行指定函數的操作,其作用類似於map()方法對Series的作用。

# 對dataframe數據中的每個元素保留2位小數<<< df.applymap(lambda x: '%.2f'%x) A B C D0 0.00 1.00 2.00 3.001 4.00 5.00 6.00 7.002 8.00 9.00 10.00 11.003 12.00 13.00 14.00 15.00

4. 總結

map()、apply()、mapapply()三者的區別總結如下:

· map():只能作用於Series中的每個元素;

· apply():既可以作用於Series中的每個元素,也可以作用於DataFrame中的行或列;

· applymap():只能作用於DataFrame中的每個元素。

疫情當下,昔日匆匆的步伐終於放慢了些,也是時候好好想想自己的職業計劃和人生規劃了。提前做好準備,未雨綢繆,為未來蓄能——蓄勢待發!

相關焦點

  • 20個Pandas函數詳解
    它提供了許多函數和方法來加快數據分析過程。pandas之所以如此普遍,是因為它具有強大的功能,以及他簡單的語法和靈活性。在這篇文章中,我將舉例來解釋20個常用的pandas函數。有些是很常見的,我敢肯定你以前用過。有些對你來說可能是新的。所有函數都將為你的數據分析過程增加價值。
  • 教程| pandas輕鬆入門 之 數據結構介紹 1
    pandas經常和其它工具一同使用,如數值計算工具NumPy和SciPy,分析庫statsmodels和scikit-learn,和數據可視化庫matplotlib。pandas是基於NumPy數組構建的,特別是基於數組的函數和不使用for循環的數據處理。雖然pandas採用了大量的NumPy編碼風格,但二者最大的不同是pandas是專門為處理表格和混雜數據設計的。
  • 圖解四個實用的pandas函數!
    作者:Baijayanta Roy來源:towardsdatascience編譯&內容補充:早起Python在用python進行機器學習或者日常的數據處理中,pandas是最常用的Python庫之一,熟練掌握pandas是每一個數據科學家的必備技能,本文將用代碼+圖片詳解Pandas中的四個實用函數!
  • 超全的pandas數據分析常用函數總結(下篇)
    上篇文章中,小編給大家總結了數據分析中pandas這一模塊裡面常用函數的四個部分的內容,分別為導入模塊、創建數據集並讀取、數據查看與數據清洗,現在給大家介紹下篇的內容。來源 | 凹凸數據5.(objs,axis = 0,ignore_index = False,keys = None)objs:Series,DataFrame或Panel對象的序列或映射。
  • 如何用Pandas庫實現MySQL資料庫的讀寫?
    ORM技術  對象關係映射技術,即ORM(Object-Relational Mapping)技術,指的是把關係資料庫的表結構映射到對象上,通過使用描述對象和資料庫之間映射的元數據,將程序中的對象自動持久化到關係資料庫中。在Python中,最有名的ORM框架是SQLAlchemy。
  • pandas向量化字符串操作方法!
    作者:小伍哥 來源:AI入門學習python內置一系列強大的字符串處理方法,但這些方法只能處理單個字符串,處理一個序列的字符串時,需要用到循環。那麼,有沒有辦法,不用循環就能同時處理多個字符串呢,pandas的向量化操作就提供了這樣的方法。
  • Pandas>>sample()函數 隨機選取若干行
    Pandas>>sample()函數 隨機選取若干行功能說明有時候我們只需要數據集中的一部分,並不需要全部的數據。這個時候我們就要對數據集進行隨機的抽樣。pandas中自帶有抽樣的方法。功能相似:numpy.random.choice函數名:DataFrame.sample(n=None,frac=None,replace=False,weights=None,random_state=None,axis=None)import pandas as pdimport numpy as npdata_test= pd.DataFrame
  • pandas指南:做更高效的數據科學家
    我通常不使用其他函數,比如to_excel,to_json,to_pickle,to_csv,雖然它們也做得很好,但是csv是保存表最常用的方法。3、檢查數據:.head(3)列印數據的前3行,.tail()函數將查看數據的最後一行。列印第8行。將第8行值列印在「column_1」上。列印第4行到第6行。
  • Pandas的介紹與基本使用
    3.4.1、分組(GroupBY機制)pandas對象(無論Series、DataFrame還是其他的什麼)當中的數據會根據提供的一個或者多個鍵被拆分為多組,拆分操作實在對象的特定軸上執行的。就比如DataFrame可以在他的行上或者列上進行分組,然後將一個函數應用到各個分組上並產生一個新的值。最後將所有的執行結果合併到最終的結果對象中。
  • pandas庫中最重要的幾個知識點
    常用函數pandas數據分析中使用比較常見的幾個函數:apply()applymap()map()transform()apply主要作用於DataFrame的某一行或者列上,(1)按行計算(2)按列計算applymap作用在dataframe的每一個元素上transform
  • 高效的5個pandas函數,你都用過嗎?
    之前為大家介紹過10個高效的pandas函數,頗受歡迎,裡面的每一個函數都能幫我們在數據分析過程中節省時間。高效的10個Pandas函數,你都用過嗎?pandas還有很多讓人舒適的用法,這次再為大家介紹5個pandas函數,作為這個系列的第二篇。1. explodeexplode用於將一行數據展開成多行。
  • 使用Pandas的resample函數處理時間序列數據的技巧
    df_sales.resample('2H').sum()要執行多個聚合,我們可以向agg()方法傳遞一個聚合函數列表。df_sales.resample('2H').agg(['min','max', 'sum'])使用自定義基數向下採樣默認情況下,對於平均細分為1天/月/年的頻率,聚合間隔的「原點」默認為0。
  • 從小白到大師,這裡有一份Pandas入門指南
    這一方法返回了一個 DataFrameGroupBy 對象,在這個對象中,通過選擇組的唯一年代標籤聚合了每一組。在這種情況下,聚合方法是「unique」方法,但它也可以接受任何(匿名)函數。另一個有趣的方法是 unstack:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.unstack.html,這種方法允許轉動索引水平。
  • 1.4 線性函數的基本屬性 1.5 複合映射與複合函數
    內容提要:線性函數的變化率、複合映射、複合函數及其複合條件、分段函數的複合方法與舉例.
  • 懶人秘籍:教你如何避免編寫pandas代碼
    在本文中,筆者首先展示了一個「如何避免」的例子,然後展示了一個正確的「如何使用」pandas來計算統計數據的方法。改進後,代碼更簡潔、易讀,執行更快。報告時間的格式為: 831 ms ± 25.7 ms per loop,即平均831毫秒,標準偏差為25.7毫秒。每個代碼示例執行多次,以計算準確的執行時間。
  • python時間序列分析之_用pandas中的rolling函數計算時間窗口數據
    上篇文章中,我們講解了如何對時間數據進行重採樣及重採樣中降採樣和升採樣的概覽和使用方法,通過重採樣我們可以得到任何想要頻率的數據,但是這些數據也是一個時點的數據,那麼就存在這樣一個問題:時點的數據波動較大,某一點的數據不能很好的表現它本身的特性,於是我們就想,能否用一個區間的的數據去表現呢,這樣數據的準確性是不是更好一些呢?
  • Python數據分析:pandas讀取和寫入數據
    pandas讀取這些數據文件的方法如表格所示:01讀取寫入文本文件read_csv()方法用來讀取 csv格式的數據文件,read_table()方法則是讀取通用分隔符分隔的數據文件,它們的參數相同。而Python的數據分析庫pandas提供了read_excel函數來讀取.xls和.xlsx兩種excel文件。其中.xls是office excel 2007之前的版本默認保存的文件擴展名。而.xlsx是2007版本之後的。 有時一個excel文件會包含多個工作表,比如下面這個表格文有book和movie兩個工作表。
  • pandas使用的25個技巧
    查詢pandas版本  如果你還想知道pandas所依賴的模塊的版本,你可以使用show_versions()函數:使用astype()函數將數據類型轉換成數值型但是,如果你對第三列也使用這個函數,將會引起錯誤,這是因為這一列包含了破折號(用來表示0)但是pandas並不知道如何處理它。
  • 懂Excel輕鬆入門Python數據分析包pandas(二十七):IF函數代替者
    後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandasnumpy.where 方法Excel 函數中有一個初學者都能馬上學會的函數——IF 函數,而在 pandas 中卻沒有對應效果的方法,這是因為 numpy 已經有了對應的實現—— where。他能根據條件(true 或者 false) 返回不同的值。
  • 【跟著stackoverflow學Pandas】- Pandas修改列的類型
    ,一般需要進行數據類型的轉化,這篇文章就介紹pandas裡面的數據類型及轉換。下面我們推薦幾種方法pd.to_numeric對於明顯是數值的數據,轉換類型直接採用 pd.to_numeric 就可以了,如果數據既有數值型又有字符型,那麼我們就要根據情況區別對待了。