最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pandas分組聚合(agg,transform,apply)

 更新時(shí)間:2024年04月03日 15:06:07   作者:craftsman2020  
在SQL中我們經(jīng)常使用 GROUP BY 將某個(gè)字段,按不同的取值進(jìn)行分組, 在pandas中也有g(shù)roupby函數(shù),本文主要介紹了pandas分組聚合(agg,transform,apply),具有一定的參考價(jià)值,感興趣的可以了解一下

在日常的數(shù)據(jù)分析中,經(jīng)常需要將數(shù)據(jù)根據(jù)某個(gè)(多個(gè))字段劃分為不同的群體(group)進(jìn)行分析,如電商領(lǐng)域?qū)⑷珖?guó)的總銷售額根據(jù)省份進(jìn)行劃分,分析各省銷售額的變化情況,社交領(lǐng)域?qū)⒂脩舾鶕?jù)畫像(性別、年齡)進(jìn)行細(xì)分,研究用戶的使用情況和偏好等。在Pandas中,上述的數(shù)據(jù)處理操作主要運(yùn)用groupby完成,這篇文章就介紹一下groupby的基本原理及對(duì)應(yīng)的agg、transform和apply操作。

1. groupby分組

為了后續(xù)圖解的方便,采用模擬生成的10個(gè)樣本數(shù)據(jù),代碼和數(shù)據(jù)如下:

import pandas as pd
import numpy as np

data = pd.DataFrame({
  "company": ["A", "B", "C", "A", "B", "C", "A", "B", "A", "A"],
  "salary": [10000, 10000, 50000, 50000, 40000, 50000, 30000, 10000, 20000, 40000],
  "age": [25, 30, 35, 40, 45, 20, 25, 30, 30, 35]
}
)
print('data = \n', data)

上面代碼輸出如下:

data = 
  company  salary  age
0       A   10000   25
1       B   10000   30
2       C   50000   35
3       A   50000   40
4       B   40000   45
5       C   50000   20
6       A   30000   25
7       B   10000   30
8       A   20000   30
9       A   40000   35

1.1 單列分組

group = data.groupby("company")
print('group = ', group)  
print('list(group) = \n', list(group))

for index, data in group:
    print('index = ', index)
    print('data = \n', data)

上面代碼輸出如下:

group =  <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000000001DA85E0>
list(group) = 
 [('A',   company  salary  age
0       A   10000   25
3       A   50000   40
6       A   30000   25
8       A   20000   30
9       A   40000   35), ('B',   company  salary  age
1       B   10000   30
4       B   40000   45
7       B   10000   30), ('C',   company  salary  age
2       C   50000   35
5       C   50000   20)]
index =  A
data = 
   company  salary  age
0       A   10000   25
3       A   50000   40
6       A   30000   25
8       A   20000   30
9       A   40000   35
index =  B
data = 
   company  salary  age
1       B   10000   30
4       B   40000   45
7       B   10000   30
index =  C
data = 
   company  salary  age
2       C   50000   35
5       C   50000   20

1.2 多列分組

df_gb = data.groupby(['company', 'salary'])
for (index1, index2), data in df_gb:
    print((index1, index2))
    print('data = \n', data)

上面代碼輸出如下:

('A', 10000)
data = 
   company  salary  age
0       A   10000   25
('A', 20000)
data = 
   company  salary  age
8       A   20000   30
('A', 30000)
data = 
   company  salary  age
6       A   30000   25
('A', 40000)
data = 
   company  salary  age
9       A   40000   35
('A', 50000)
data = 
   company  salary  age
3       A   50000   40
('B', 10000)
data = 
   company  salary  age
1       B   10000   30
7       B   10000   30
('B', 40000)
data = 
   company  salary  age
4       B   40000   45
('C', 50000)
data = 
   company  salary  age
2       C   50000   35
5       C   50000   20

1.3 groupby的基本原理

在pandas中,實(shí)現(xiàn)分組操作的代碼很簡(jiǎn)單,僅需一行代碼,在這里,將上面的數(shù)據(jù)集按照company字段進(jìn)行劃分

group = data.groupby(“company”)

會(huì)得到一個(gè)DataFrameGroupBy對(duì)象,那這個(gè)生成的DataFrameGroupBy是啥呢?返回的結(jié)果是其內(nèi)存地址,并不利于直觀地理解,為了看看group內(nèi)部究竟是什么,這里把group轉(zhuǎn)換成list的形式來(lái)看?;蛘遞or循環(huán)迭代出來(lái)看。

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002B7E2650240>

轉(zhuǎn)換成列表的形式后,可以看到,列表由三個(gè)元組組成,每個(gè)元組中,第一個(gè)元素是組別(這里是按照company進(jìn)行分組,所以最后分為了A,B,C),第二個(gè)元素的是對(duì)應(yīng)組別下的DataFrame,整個(gè)過(guò)程可以圖解如下:

groupby

總結(jié)來(lái)說(shuō),groupby的過(guò)程就是將原有的DataFrame按照groupby的字段(這里是company),劃分為若干個(gè)分組DataFrame,被分為多少個(gè)組就有多少個(gè)分組DataFrame。所以說(shuō),在groupby之后的一系列操作(如agg、apply等),均是基于子DataFrame的操作。理解了這點(diǎn),也就基本摸清了Pandas中g(shù)roupby操作的主要原理。下面來(lái)講講groupby之后的常見(jiàn)操作。

2. groupby|agg聚合

聚合操作是groupby后非常常見(jiàn)的操作,會(huì)寫SQL的朋友對(duì)此應(yīng)該是非常熟悉了。聚合操作可以用來(lái)求和、均值、最大值、最小值等,下面的表格列出了Pandas中常見(jiàn)的聚合操作。

pandas agg

2.1 對(duì)分組后所有數(shù)據(jù)進(jìn)行聚合

默認(rèn)情況對(duì)分組之后其他列進(jìn)行聚合

df_agg = data.groupby('company').agg(['min', 'mean', 'max'])
print(df_agg)

上面代碼輸出如下:

        salary               age          
           min   mean    max min  mean max
company                                   
A        10000  30000  50000  25  31.0  40
B        10000  20000  40000  30  35.0  45
C        50000  50000  50000  20  27.5  35

2.2 對(duì)分組后的部分列進(jìn)行聚合

某些情況,只需要對(duì)部分?jǐn)?shù)據(jù)進(jìn)行不同的聚合操作,可以通過(guò)字典來(lái)構(gòu)建

print(data.groupby('company').agg({'age': ['min', 'mean', 'max']}))

上面代碼輸出如下:

        age          
        min  mean max
company              
A        25  31.0  40
B        30  35.0  45
C        20  27.5  35
        age           salary

print(data.groupby('company').agg({'age': ['min', 'mean', 'max'], 'salary': 'min'}))

上面代碼輸出如下:

        age           salary
        min  mean max    min
company                     
A        25  31.0  40  10000
B        30  35.0  45  10000
C        20  27.5  35  50000

print(data.groupby('company').agg({'salary': 'median', 'age': 'mean'}))

上面代碼輸出如下:

         salary   age
company              
A         30000  31.0
B         10000  35.0
C         50000  27.5

2.3 agg聚合過(guò)程圖解

pandas agg

3. groupby|transform

transform是一種什么數(shù)據(jù)操作?和agg有什么區(qū)別呢?為了更好地理解transform和agg的不同,下面從實(shí)際的應(yīng)用場(chǎng)景出發(fā)進(jìn)行對(duì)比。

在上面的agg中,我們學(xué)會(huì)了如何求不同公司員工的平均薪水,如果現(xiàn)在需要在原數(shù)據(jù)集中新增一列avg_salary,代表員工所在的公司的平均薪水(相同公司的員工具有一樣的平均薪水),該怎么實(shí)現(xiàn)呢?如果按照正常的步驟來(lái)計(jì)算,需要先求得不同公司的平均薪水,然后按照員工和公司的對(duì)應(yīng)關(guān)系填充到對(duì)應(yīng)的位置,不用transform的話,實(shí)現(xiàn)代碼如下:

avg_salary_dict = data.groupby('company')['salary'].mean().to_dict()
data['avg_salary'] = data['company'].map(avg_salary_dict)
print('data = \n', data)

上面代碼輸出如下:

data = 
   company  salary  age  avg_salary
0       A   10000   25       30000
1       B   10000   30       20000
2       C   50000   35       50000
3       A   50000   40       30000
4       B   40000   45       20000
5       C   50000   20       50000
6       A   30000   25       30000
7       B   10000   30       20000
8       A   20000   30       30000
9       A   40000   35       30000

如果使用transform的話,僅需要一行代碼:

data['avg_salary'] = data.groupby('company')['salary'].transform('mean')
print('data = \n', data)

上面代碼輸出如下:

data = 
   company  salary  age  avg_salary
0       A   10000   25       30000
1       B   10000   30       20000
2       C   50000   35       50000
3       A   50000   40       30000
4       B   40000   45       20000
5       C   50000   20       50000
6       A   30000   25       30000
7       B   10000   30       20000
8       A   20000   30       30000
9       A   40000   35       30000

3.1 transform實(shí)現(xiàn)過(guò)程圖解

還是以圖解的方式來(lái)看看進(jìn)行g(shù)roupby后transform的實(shí)現(xiàn)過(guò)程(為了更直觀展示,圖中加入了company列,實(shí)際按照上面的代碼只有salary列):

pandas

圖中的大方框是transform和agg所不一樣的地方,對(duì)agg而言,會(huì)計(jì)算得到A,B,C公司對(duì)應(yīng)的均值并直接返回,但對(duì)transform而言,則會(huì)對(duì)每一條數(shù)據(jù)求得相應(yīng)的結(jié)果,同一組內(nèi)的樣本會(huì)有相同的值,組內(nèi)求完均值后會(huì)按照原索引的順序返回結(jié)果,如果有不理解的可以拿這張圖和agg那張對(duì)比一下。

4. groupby|apply

apply應(yīng)該是大家的老朋友了,它相比agg和transform而言更加靈活,能夠傳入任意自定義的函數(shù),實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)操作。在Pandas數(shù)據(jù)處理三板斧——map、apply、applymap詳解中,介紹了apply的使用,那在groupby后使用apply和之前所介紹的有什么區(qū)別呢?

區(qū)別是有的,但是整個(gè)實(shí)現(xiàn)原理是基本一致的。兩者的區(qū)別在于,對(duì)于groupby后的apply,以分組后的子DataFrame作為參數(shù)傳入指定函數(shù)的,基本操作單位是DataFrame,而之前介紹的apply的基本操作單位是Series。還是以一個(gè)案例來(lái)介紹groupby后的apply用法。

假設(shè)我現(xiàn)在需要獲取各個(gè)公司年齡最大的員工的數(shù)據(jù),該怎么實(shí)現(xiàn)呢?可以用以下代碼實(shí)現(xiàn):

def get_oldest_staff(x):
    df = x.sort_values(by= 'age', ascending = True)
    return df.iloc[-1, :]


oldest_staff = data.groupby('company', as_index = False).apply(get_oldest_staff)
print('oldest_staff = \n', oldest_staff)

上面代碼輸出如下:

oldest_staff = 
   company  salary  age
0       A   50000   40
1       B   40000   45
2       C   50000   35

流程圖如下:

apply

可以看到,此處的apply和上篇文章中所介紹的作用原理基本一致,只是傳入函數(shù)的參數(shù)由Series變?yōu)榱舜颂幍姆纸MDataFrame。

最后,關(guān)于apply的使用,這里有個(gè)小建議,雖然說(shuō)apply擁有更大的靈活性,但apply的運(yùn)行效率會(huì)比agg和transform更慢。所以,groupby之后能用agg和transform解決的問(wèn)題還是優(yōu)先使用這兩個(gè)方法,實(shí)在解決不了了才考慮使用apply進(jìn)行操作。

到此這篇關(guān)于pandas分組聚合(agg,transform,apply)的文章就介紹到這了,更多相關(guān)pandas分組聚合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python檢測(cè)遠(yuǎn)程服務(wù)器tcp端口的方法

    python檢測(cè)遠(yuǎn)程服務(wù)器tcp端口的方法

    這篇文章主要介紹了python檢測(cè)遠(yuǎn)程服務(wù)器tcp端口的方法,涉及Python操作socket檢測(cè)tcp端口的技巧,需要的朋友可以參考下
    2015-03-03
  • python3下實(shí)現(xiàn)搜狗AI API的代碼示例

    python3下實(shí)現(xiàn)搜狗AI API的代碼示例

    這篇文章主要介紹了python3下實(shí)現(xiàn)搜狗AI API的代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python驗(yàn)證碼識(shí)別的方法

    Python驗(yàn)證碼識(shí)別的方法

    這篇文章主要介紹了Python驗(yàn)證碼識(shí)別的方法,涉及Python針對(duì)驗(yàn)證碼圖片的相關(guān)分析與操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Python數(shù)據(jù)列表中的空補(bǔ)0的問(wèn)題解決

    Python數(shù)據(jù)列表中的空補(bǔ)0的問(wèn)題解決

    在Python中,如果你有一個(gè)包含空值的數(shù)據(jù)列表,你可以使用列表推導(dǎo)式或循環(huán)將這些空值替換為0,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下
    2024-03-03
  • 解決tensorflow模型壓縮的問(wèn)題_踩坑無(wú)數(shù),總算搞定

    解決tensorflow模型壓縮的問(wèn)題_踩坑無(wú)數(shù),總算搞定

    這篇文章主要介紹了解決tensorflow模型壓縮的問(wèn)題_踩坑無(wú)數(shù),總算搞定!希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python中的變量與常量

    Python中的變量與常量

    本文基于Python基礎(chǔ),主要介紹了Python基礎(chǔ)中變量和常量的區(qū)別,對(duì)于變量的用法做了詳細(xì)的講解,用豐富的案例 ,代碼效果圖的展示幫助大家更好理解,需要的朋友可以參考下
    2021-11-11
  • pandas實(shí)現(xiàn)滑動(dòng)窗口的示例代碼

    pandas實(shí)現(xiàn)滑動(dòng)窗口的示例代碼

    本文主要介紹了pandas實(shí)現(xiàn)滑動(dòng)窗口的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解

    python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解內(nèi)容,需要的朋友們可以參考下。
    2020-08-08
  • python遞歸調(diào)用中的坑:打印有值, 返回卻None

    python遞歸調(diào)用中的坑:打印有值, 返回卻None

    這篇文章主要介紹了python遞歸調(diào)用中的坑:打印有值, 返回卻None,本文通過(guò)問(wèn)題分析給出解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • python中的全局變量用法分析

    python中的全局變量用法分析

    這篇文章主要介紹了python中的全局變量用法,詳細(xì)分析了Python全局變量使用中的利弊與相關(guān)技巧,需要的朋友可以參考下
    2015-06-06

最新評(píng)論

建湖县| 德化县| 寻甸| 南雄市| 馆陶县| 华亭县| 德令哈市| 武陟县| 金堂县| 江津市| 广东省| 尼木县| 青海省| 青海省| 工布江达县| 东平县| 碌曲县| 池州市| 丰原市| 宜良县| 武夷山市| 云和县| 温泉县| 灵山县| 虎林市| 沙雅县| 卢氏县| 白银市| 德保县| 贺兰县| 潞城市| 崇左市| 岳普湖县| 周宁县| 横峰县| 江口县| 天祝| 永济市| 木兰县| 峡江县| 和静县|