【Pandas】groupby 分组聚合操作

目录

获取数据

1. 单分区 | 单键分组|同一类聚合

2. 多分区|单键分组|同一类聚合

3. 单分区|多键分组|同一类聚合

4. 单分区|单键分组|多类型聚合

5. 单分区|多键分组|多异类型聚合

6. 单分区|多键分组|多同类型聚合

7. 单分区|多键分组计算操作 apply()

遍历 groupby 的结果

Pandas库里的groupby首先按照 key 进行分组,就可以得到每个 groupby 的名称,以及 group 本身;

group本身是一个dataframe或者一个series;

再在这个dataframe或者series基础上进行统计。统计完成之后会将key和统计结果拼合起来。

获取数据

import pandas as pd
df = pd.DataFrame([['liver', 'E', 89, 21, 24, 64],
                   ['Arry', 'C', 36, 37, 37, 57],
                   ['Ack', 'A', 57, 60, 18, 84],
                   ['Eorge', 'C', 93, 96, 71, 78],
                   ['Oah', 'D', 65, 49, 61, 86]
                   ],
                  columns=['name', 'team', 'Q1', 'Q2', 'Q3', 'Q4'])
print(df)

1. 单分区 | 单键分组|同一类聚合

# 计算每个team的Q1季度平均值
res0 = df.groupby("team")["Q1"].mean()
print(res0)

注意:groupby 中的 'Team' 变成了数据的索引列。

2. 多分区|单键分组|同一类聚合

# 计算每个team里,每个人Q1季度的最大值
res1 = df.groupby(["team","name"])["Q1"].max()
print(res1)

注意:这点和实际情况套的不像,但只是为了说明情况。索引列变成了 team 和 name 的组合,如下图:

上面这种方式('team','name')成对变成了二级索引,如果想要去除这种二级索引的方式,可以设置as_index=False

res1=df.groupby(["team","name"],as_index=False)["Q1"].max()
print(res1)

3. 单分区|多键分组|同一类聚合

# 计算每个 team 的 Q1季度和 Q3季度平均值
res2=df.groupby("team")["Q1","Q3"].mean()
print(res2)

4. 单分区|单键分组|多类型聚合

# 计算每个team的Q2季度的最大值和Q2季度的平均值
res3=df.groupby("team")["Q2"].agg(["max","mean"])
print(res3)
# 对聚合的结果进行命名(元组)
res4=df.groupby("team")["Q2"].agg([("max_Q2","max"),("mean_Q2","mean")])
print(res4)

5. 单分区|多键分组|多异类型聚合

# 根据字段'team'进行分组,字段'Q1'求和,字段'Q2'求平均 
import numpy as np
res5 = df.groupby('team').agg({"Q1":np.sum, "Q2":np.mean})
print(res5)

Pandas 中的的 agg()函数为 aggregate的缩写,总数、合计、聚合的意思,在Pandas中可以利用 agg()对SeriesDataFrame 以及 groupby()后的结果进行聚合操作。

传入的参数:列表或字典(键为变量名,值为对应的聚合函数字符串,譬如

{'键名1':['sum','max'], '键名2':['median','max','min']}

就代表对数据框中的键名1列进行求和、最大值操作,对键名2列进行中位数、最大值、最小值操作。

6. 单分区|多键分组|多同类型聚合

# 分别计算每个team的Q2季度和Q4季度的平均值和最大值
res6 = df.groupby("team")["Q2","Q4"].agg(["mean","max"])
print(res6)

6都是平均值和最大值,注意与5的区别。

7. 单分区|多键分组计算操作 apply()

# 计算每个team的Q1季度平均值与Q2季度平均值之差
res7 = df.groupby("team").apply(lambda x:x["Q1"].mean()-x["Q2"].mean())
print(res7)

遍历 groupby 的结果

# group之后的数据格式是DataFrameGroupBy <pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fa717236dc0>
res8 = df.groupby("team")

for team,group in res8:
    print(team)
    print(group)
    print()

使用 get_group 方法单独获取某个分组

res9 = df.groupby("team")
grouped = res9.get_group("C") # 按照分区team里面的键名来get_group
print(grouped)

上述的结果是单分区聚合,如果是多分区的话,那么列于列之间的数值就会发生排列组合,利用groupby方法也是可以聚合。只不过遍历team_name是一个2个元素的元组,代表不同的列。

res10 = df.groupby(["team","name"])
for team_name,group in res10:
    print(team_name)
    print(group)
    print()

同样利用get_group方法可以查看到分组之后的一个子dataframe情况。

res11 = df.groupby(["team","name"])
grouped = res11.get_group(("C","Eorge"))
print(grouped)

如果分组之后,只想查看某几列的分组情况,可以采用以下方法(type是series):

res12 = df.groupby("team")
for team,group in res12["Q1"]:  # 只想看Q1的结果
    print(team)
    print(group)
    print()

参考链接:

[Pandas] groupby分组聚合操作

Pandas系列(十二)实现groupby分组统计_小小何先生的博客-CSDN博客

  • 27
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值