目录
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)
![](https://i-blog.csdnimg.cn/blog_migrate/815b2fd7e5d16005117f2621dede5500.png)
1. 单分区 | 单键分组|同一类聚合
# 计算每个team的Q1季度平均值
res0 = df.groupby("team")["Q1"].mean()
print(res0)
![](https://i-blog.csdnimg.cn/blog_migrate/201fb53908da867bbfdd1776a0f532be.png)
注意:groupby 中的 'Team' 变成了数据的索引列。
2. 多分区|单键分组|同一类聚合
# 计算每个team里,每个人Q1季度的最大值
res1 = df.groupby(["team","name"])["Q1"].max()
print(res1)
![](https://i-blog.csdnimg.cn/blog_migrate/b789524fff14492b902c1a12f4666d29.png)
注意:这点和实际情况套的不像,但只是为了说明情况。索引列变成了 team 和 name 的组合,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/38e65e9300cc3b59f503023558dd0c71.png)
上面这种方式('team','name')成对变成了二级索引,如果想要去除这种二级索引的方式,可以设置as_index=False
res1=df.groupby(["team","name"],as_index=False)["Q1"].max()
print(res1)
![](https://i-blog.csdnimg.cn/blog_migrate/bb4caf725a2ea11c19474877aaea2dee.png)
3. 单分区|多键分组|同一类聚合
# 计算每个 team 的 Q1季度和 Q3季度平均值
res2=df.groupby("team")["Q1","Q3"].mean()
print(res2)
![](https://i-blog.csdnimg.cn/blog_migrate/4e07d39e46838d2b206a254efedec5da.png)
4. 单分区|单键分组|多类型聚合
# 计算每个team的Q2季度的最大值和Q2季度的平均值
res3=df.groupby("team")["Q2"].agg(["max","mean"])
print(res3)
![](https://i-blog.csdnimg.cn/blog_migrate/07d1659a583b6a417491cfce190830fa.png)
# 对聚合的结果进行命名(元组)
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)
![](https://i-blog.csdnimg.cn/blog_migrate/dafb23f50cdae38058e8741c658a1b34.png)
Pandas 中的的 agg()函数为 aggregate的缩写,总数、合计、聚合的意思,在Pandas中可以利用 agg()对Series、DataFrame 以及 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)
![](https://i-blog.csdnimg.cn/blog_migrate/0120597bbe9499535084645fd6a353e3.png)
6都是平均值和最大值,注意与5的区别。
7. 单分区|多键分组计算操作 apply()
# 计算每个team的Q1季度平均值与Q2季度平均值之差
res7 = df.groupby("team").apply(lambda x:x["Q1"].mean()-x["Q2"].mean())
print(res7)
![](https://i-blog.csdnimg.cn/blog_migrate/275ad7e4f9d2052510aaaf3bed9a928e.png)
遍历 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()
![](https://i-blog.csdnimg.cn/blog_migrate/dacd1dd2feffc3ef4bdbfceee62a60a3.png)
使用 get_group 方法单独获取某个分组
res9 = df.groupby("team")
grouped = res9.get_group("C") # 按照分区team里面的键名来get_group
print(grouped)
![](https://i-blog.csdnimg.cn/blog_migrate/8ce81dfe92d6e5adb91027b6075448f9.png)
上述的结果是单分区聚合,如果是多分区的话,那么列于列之间的数值就会发生排列组合,利用groupby
方法也是可以聚合。只不过遍历team_name是一个2
个元素的元组,代表不同的列。
res10 = df.groupby(["team","name"])
for team_name,group in res10:
print(team_name)
print(group)
print()
![](https://i-blog.csdnimg.cn/blog_migrate/85c77f4694c0fd9106674aad044261fd.png)
同样利用get_group方法可以查看到分组之后的一个子dataframe情况。
res11 = df.groupby(["team","name"])
grouped = res11.get_group(("C","Eorge"))
print(grouped)
![](https://i-blog.csdnimg.cn/blog_migrate/82f5d3b5d22a31c77d5a31817543a033.png)
如果分组之后,只想查看某几列的分组情况,可以采用以下方法(type是series):
res12 = df.groupby("team")
for team,group in res12["Q1"]: # 只想看Q1的结果
print(team)
print(group)
print()
![](https://i-blog.csdnimg.cn/blog_migrate/0cc0c08660e912d5ca36406e1fe99e4f.png)
参考链接: