熱線電話:13121318867

登錄
首頁大數據時代數據分析師教程《Python數據分析極簡入門》第2節 7 Pandas分組聚合
數據分析師教程《Python數據分析極簡入門》第2節 7 Pandas分組聚合
2024-11-25
收藏

《Python數據分析極簡入門》

第2節 7 Pandas分組聚合

分組聚合(group by)顧名思義就是分2步:

  • 先分組:根據某列數據的值進行分組。用groupby()對某列進行分組
  • 后聚合:將結果應用聚合函數進行計算。在agg()函數里應用聚合函數計算結果,如sum()、mean()、count()、max()、min()等,用于對每個分組進行聚合計算。
import pandas as pd
import numpy as np
import random
df = pd.DataFrame({'A': ['a''b''a''b','a''b'],
                   'B': ['L''L''M''N','M''M'],
                   'C': [10717713935238],
                   'D': [225938506082]})

df
A B C D
0 a L 107 22
1 b L 177 59
2 a M 139 38
3 b N 3 50
4 a M 52 60
5 b M 38 82

單列分組

① 對單列分組后應用sum聚合函數

df.groupby('A').sum()
C D
A
a 298 120
b 218 191

② 對單列分組后應用單個指定的聚合函數

df.groupby('A').agg({'C''min'}).rename(columns={'C''C_min'})
C_min
A
a 52
b 3

③ 對單列分組后應用多個指定的聚合函數

df.groupby(['A']).agg({'C':'max','D':'min'}).rename(columns={'C':'C_max','D':'D_min'})
C_max D_min
A
a 139 22
b 177 50

兩列分組

① 對多列分組后應用sum聚合函數:

df.groupby(['A''B']).sum()
C D
A B
a L 107 22
M 191 98
b L 177 59
M 38 82
N 3 50

② 對兩列進行group 后,都應用max聚合函數

df.groupby(['A','B']).agg({'C':'max'}).rename(columns={'C''C_max'})
C_max
A B
a L 107
M 139
b L 177
M 38
N 3

③ 對兩列進行分組group 后,分別應用max、min聚合函數

df.groupby(['A','B']).agg({'C':'max','D':'min'}).rename(columns={'C':'C_max','D':'D_min'})
C_max D_min
A B
a L 107 22
M 139 38
b L 177 59
M 38 82
N 3 50

補充1: 應用自定義的聚合函數

df = pd.DataFrame({'A': ['a''b''a''b','a''b'],
                   'B': ['L''L''M''N','M''M'],
                   'C': [10717713935238],
                   'D': [225938506082]})

df
A B C D
0 a L 107 22
1 b L 177 59
2 a M 139 38
3 b N 3 50
4 a M 52 60
5 b M 38 82
# 使用自定義的聚合函數計算每個分組的最大值和最小值
def custom_agg(x):
    return x.max() - x.min()
result =  df[['B','C']].groupby('B').agg({'C': custom_agg})
result
C
B
L 70
M 101
N 0

補充2: 開窗函數(類似于SQL里面的over partition by):

使用transform函數計算每個分組的均值

# 使用transform函數計算每個分組的均值
df['B_C_std'] =  df[['B','C']].groupby('B')['C'].transform('mean')
df
A B C D B_C_std
0 a L 107 22 142.000000
1 b L 177 59 142.000000
2 a M 139 38 76.333333
3 b N 3 50 3.000000
4 a M 52 60 76.333333
5 b M 38 82 76.333333

補充3: 分組聚合拼接字符串 pandas實現類似 group_concat 功能

假設有這樣一個數據:

df = pd.DataFrame({
    '姓名': ['張三''張三''張三''李四''李四''李四'],
    '科目': ['語文''數學''英語''語文''數學''英語']
})

df
姓名 科目
0 張三 語文
1 張三 數學
2 張三 英語
3 李四 語文
4 李四 數學
5 李四 英語

補充:按某列分組,將另一列文本拼接合并

按名稱分組,把每個人的科目拼接到一個字符串:

# 對整個group對象中的所有列應用join 連接元素
(df.astype(str)# 先將數據全轉為字符
.groupby('姓名')# 分組
.agg(lambda x : ','.join(x)))[['科目']]# join 連接元素
科目
姓名
張三 語文,數學,英語
李四 語文,數學,英語

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢