Pandas transform函數

2021-01-11 人工智慧遇見磐創

Pandas是一個很有用的庫,它包含了大量用於操作數據的內置函數。其中,transform()在處理行或列時非常有用。

在本文中,我們將介紹以下最常用的Pandas transform()用途:

轉換值組合groupby()過濾數據在組級別處理缺失值請查看我的Github repo以獲取原始碼;https://github.com/BindiChen/machine-learning/blob/master/data-analysis/013-pandas-transform/pandas-transform.ipynb

1.轉換值

我們來看看pd.transform(func, axis=0)

第一個參數func指定用於操作數據的函數。它可以是函數、字符串函數名、函數列表或軸標籤->函數的字典第二個參數軸指定函數應用於哪個軸。0表示對每列應用func,1表示對每行應用func。讓我們看看transform()是如何在一些示例的幫助下工作的。

函數

我們可以把函數傳遞給func。例如

df = pd.DataFrame({'A': [1,2,3], 'B': [10,20,30] })def plus_10(x): return x+10df.transform(plus_10)

也可以使用lambda表達式。下面是plus_10()的lambda等價形式:

df.transform(lambda x: x+10)字符串函數

我們可以將任何有效的Pandas字符串函數傳遞給func,例如'sqrt':

df.transform('sqrt')

函數列表

func可以是函數的列表。例如,來自NumPy的sqrt和exp:

df.transform([np.sqrt, np.exp])

軸標籤->函數的字典

func可以是軸標籤->函數的字典。例如

df.transform({ 'A': np.sqrt, 'B': np.exp,})

2.組合groupby()

Pandas transform()最引人注目的用法之一是組合groupy()結果。

讓我們通過一個例子來看看這是如何工作的。假設我們有一個關於連鎖餐廳的數據集

df = pd.DataFrame({ 'restaurant_id': [101,102,103,104,105,106,107], 'address': ['A','B','C','D', 'E', 'F', 'G'], 'city': ['London','London','London','Oxford','Oxford', 'Durham', 'Durham'], 'sales': [10,500,48,12,21,22,14]})

我們可以看到,每個城市都有多家餐廳在銷售。我們想知道「每一家餐廳在本市的銷售額佔比是多少」。預期輸出為:

在這個計算中最棘手的部分是,我們需要得到一個城市的總銷售額,並將其合併到數據中,以得到百分比。

有兩種解決方案:

groupby()、apply()和merge()groupby()和transform()解決方案1:groupby()、apply()和merge()

第一種解決方案是使用groupby()分割數據,並使用apply()聚合每個組,然後使用merge()將結果合併回原始數據幀中

第1步:使用groupby()和apply()計算城市銷售總額

city_sales = df.groupby('city')['sales'] .apply(sum).rename('city_total_sales').reset_index()

groupby('city')通過在city列上分組來拆分數據。對於每個組,函數sum應用於sales列,以計算每個組的總和。最後,將新列重命名為city_total_sales並重置索引(注意:需要reset_inde()來清除groupby('city')生成的索引。

此外,Pandas還有一個內置的sum()函數,下面是Pandas sum()的等效函數:

city_sales = df.groupby('city')['sales'] .sum().rename('city_total_sales').reset_index()第2步:使用merge()函數合併結果

df_new = pd.merge(df, city_sales, how='left')

使用merge()和left outer join的how='left'將組結果合併回到原始的DataFrame中

第3步:計算百分比

最後,可以計算並格式化百分比。

df_new['pct'] = df_new['sales'] / df_new['city_total_sales']df_new['pct'] = df_new['pct'].apply(lambda x: format(x, '.2%'))

這當然是我們的工作。但這是一個多步驟的過程,需要額外的代碼才能以我們需要的形式獲取數據。

我們可以使用transform()函數有效地解決這個問題

解決方案2:groupby()和transform()

這個解決方案改變了遊戲規則。一行代碼就可以解決應用和合併問題。

步驟1:使用groupby()和transform()計算城市銷售總額

轉換函數在執行轉換後保留與原始數據集相同數量的項。因此,使用groupby後跟transform(sum)的單行步驟返回相同的輸出。

df['city_total_sales'] = df.groupby('city')['sales'] .transform('sum')

第2步:計算百分比

最後,這和求百分比是一樣的。

df['pct'] = df['sales'] / df['city_total_sales']df['pct'] = df['pct'].apply(lambda x: format(x, '.2%'))3.過濾數據

transform()也可用於過濾數據。在這裡,我們試圖獲得該市總銷售額超過40的記錄

df[df.groupby('city')['sales'].transform('sum') > 40]

4.在組級別處理丟失的值

Pandas transform()的另一個用法是在組級別處理丟失的值。讓我們用一個例子來看看這是如何工作的。

這裡有一個數據幀供演示

df = pd.DataFrame({ 'name': ['A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], 'value': [1, np.nan, np.nan, 2, 8, 2, np.nan, 3]})

在上面的示例中,可以按名稱將數據分成三組,每個組都缺少值。替換缺失值的常見解決方案是用平均值替換NaN。

讓我們看看每組的平均值。

df.groupby('name')['value'].mean()nameA 1.0B 5.0C 2.5Name: value, dtype: float64在這裡,我們可以使用transform()將缺少的值替換為組平均值。

df['value'] = df.groupby('name') .transform(lambda x: x.fillna(x.mean()))

你可以在我的Github上獲取原始碼:https://github.com/BindiChen/machine-learning/blob/master/data-analysis/013-pandas-transform/pandas-transform.ipynb

相關焦點

  • 盤點Pandas 的100個常用函數
    作者 | 劉順祥 來源 | 數據分析1480 這一期將分享我認為比較常規的100個實用函數,這些函數大致可以分為六類,分別是統計匯總函數、數據清洗函數、數據篩選、繪圖與元素級運算函數、時間序列函數和其他函數。統計匯總函數數據分析過程中,必然要做一些數據的統計匯總工作,那麼對於這一塊的數據運算有哪些可用的函數可以幫助到我們呢?
  • 數據處理必看:如何讓你的 pandas 循環加快 71803 倍
    雷鋒網 AI 開發者按,如果你使用 python 和 pandas 進行數據分析,那麼不久你就會第一次使用循環了。然而,即使是對小型數據集,使用標準循環也很費時,你很快就會意識到大型數據幀可能需要很長的時間。當我第一次等了半個多小時來執行代碼時,我找到了接下來想與你共享的替代方案。標準循環數據幀是具有行和列的 pandas 對象。
  • Pandas 必知必會的使用技巧,值得收藏!
    df = pd.DataFrame({'Sp':['a','b','c','d','e','f'], 'Mt':['s1', 's1', 's2','s2','s2','s3'], 'Value':[1,2,3,4,5,6], 'Count':[3,2,5,10,10,6]}) df df.iloc
  • Pandas 數據處理|Datetime 時間模塊在 Pandas 中的使用
    Datatime 作為 Python 中的時間模塊類型,處理時間有關數據是非常方便的, Pandas 作為數據分析程序包同樣也支持 DataTime 數據機制,例如1,函數 to_datetime() 將數據列表中的 Series 列轉化為 datetime 類型,#Convert the type to datetimeapple.Date =
  • 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.
  • 英語小作文: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
  • Pandas GUI:如何輕鬆獲取Pandas數據幀?
    這些庫本質上是在hood中運行Pandas的功能,如SweetViz和Pandas profiling庫。· 基於GUI的Pandas替代品,如Bamboolib。最近,筆者發現了另一個基於GUI的Pandas替代,叫做PandasGUI。它具有繪製數據幀以及重新構建數據幀的功能,用戶也可以進行任意自定義操作。本文將介紹它的各種功能以及在數據中使用的方法。
  • 關於Numpy和Pandas axis的理解
    每一行給的值通常是我們的樣本值,它也是損失函數準確度的一個依據。參考文檔pandas axis的用法關於pandas中axis屬性的一點理解感受希望大家可以慢慢領悟!:)武漢加油!湖北加油!中國加油!大家加油!
  • Python數據處理包,pandas 乾貨知識,關於軸的理解
    前言axis 表示軸,是處理多維數據時用於表示維度方向的概念,在 pandas 中大部分的方法都有 axis 參數,因為 pandas 需要調用者告訴他,需要處理的是哪個維度的數據。本文將分享我對 axis 的理解,希望幫助你更好理解 axis 的概念,這些概念不僅僅應用在 pandas ,同樣適合於其他相關的庫的理解(如 numpy 中的3維或以上的處理)。
  • PandaSQL:一個讓你能夠通過SQL語句進行pandas的操作的python包
    import pandas as pd import random import datetime def random_dt_bw(start_date,end_date): days_between = (end_date - start_date).days random_num_days = random.randrange(days_between) random_dt
  • 理解transform中的matrix
    CSS中有個函數,改變六個數值就可以實現平移、旋轉、縮放等2D變換效果。那麼問題來了:本文探討其背後原理,先在二維坐標系下推導公式,最後用齊次坐標統一形式。css裡的默認變換中心是對象中心,transform-origin可以指定變換中心,我猜測是先平移到原點進行變換,再平移回原位置,如果你知道答案請告訴我。二維縮放
  • 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.
  • Pandas 中第二好用的函數是?
    本文主要講的是Pandas中第二好用的函數——apply。為什麼說第二好用呢?做人嘛,最重要的就是謙虛,做函數也是一樣的,而apply就是這樣一個優雅而謙虛的函數。我們單獨用一篇來為apply樹碑立傳,原因有二,一是因為apply函數極其靈活高效,甚至是重新定義了pandas的靈活,一旦熟練運用,在數據清洗和分析界可謂是「屠龍在手,天下我有」;二是apply概念相對晦澀,需要結合具體案例去咀嚼和實踐。Apply初體驗apply函數,因為她總是和分組函數一起出現,所以在江湖得了個「groupby伴侶」的稱號。
  • 懂Excel輕鬆入門Python數據分析包pandas(二十七):IF函數代替者
    後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandasnumpy.where 方法Excel 函數中有一個初學者都能馬上學會的函數——IF 函數,而在 pandas 中卻沒有對應效果的方法,這是因為 numpy 已經有了對應的實現—— where。他能根據條件(true 或者 false) 返回不同的值。
  • Netizens worry about panda foaming at the mouth in Chinese zoo
    The ecology administration of Gansu published a statement on Tuesday, saying 「panda Shulan’s foaming is normal," explaining that the foam was either saliva or caused by the female panda being in
  • Python:將XML數據存儲到Pandas DataFrame中
    在這篇文章中,我們將討論如何使用python xml庫中的 「ElementTree」模塊來解析xml數據並將數據存儲在panda DataFrame中。首先,讓導入Python庫:import pandas as pdfrom xml.etree.ElementTree import parse現在,讓我們看一下'books.xml'文件中的標籤:我們可以通過將文件名傳遞給'parse()'方法來定義'XML'文檔對象:document = parse('books.xml')
  • ...captive giant panda twins have been born in Chengdu in 2020!
    Amid the gloom spawned by coronavirus pandemic, there's a heartening piece of news - a pair of captive giant panda twins have been born in Chengdu in 2020!