热线电话: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 后,分别应用maxmin聚合函数

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 连接元素
科目
姓名
张三 语文,数学,英语
李四 语文,数学,英语
最新资讯
更多
客服在线
立即咨询