目录
1. group by+单个字段+单个聚合
2. group by+单个字段+多个聚合
3. group by+多个字段+单个聚合
4. group by+多个字段+多个聚合
5. transform函数
| students | grade | sex | score | money | |
|---|---|---|---|---|---|
| 0 | 小狗 | 小学部 | female | 95 | 844 |
| 1 | 小猫 | 小学部 | male | 93 | 836 |
| 2 | 小鸭 | 初中部 | male | 83 | 854 |
| 3 | 小兔 | 小学部 | female | 90 | 931 |
| 4 | 小花 | 小学部 | male | 81 | 853 |
| 5 | 小草 | 小学部 | male | 80 | 991 |
| 6 | 小狗 | 初中部 | female | 81 | 854 |
| 7 | 小猫 | 小学部 | male | 93 | 886 |
| 8 | 小鸭 | 小学部 | male | 88 | 983 |
| 9 | 小兔 | 小学部 | male | 86 | 891 |
| 10 | 小花 | 初中部 | male | 92 | 830 |
| 11 | 小草 | 初中部 | male | 84 | 948 |
1. group by+单个字段+单个聚合
1.1 方法一
# 求每个人的总金额:
total_money=df.groupby("students")["money"].sum().reset_index()
total_money
1.2 方法二(使用agg)
df.groupby("students").agg({"money":"sum"}).reset_index()
#或者
df.groupby("students").agg({"money":np.sum}).reset_index()
| students | money | |
|---|---|---|
| 0 | 小兔 | 1820 |
| 1 | 小狗 | 1711 |
| 2 | 小猫 | 1670 |
| 3 | 小花 | 1861 |
| 4 | 小草 | 1825 |
| 5 | 小鸭 | 1719 |
2. group by+单个字段+多个聚合
2.1 方法一(使用group by+merge)
mean_money = df.groupby("students")["money"].mean().reset_index()
mean_money.columns = ["students","mean_money"]
mean_money
total_mean = total_money.merge(mean_money)
total_mean

total_mean = total_money.merge(mean_money)
total_mean
| students | total_money | mean_money | |
|---|---|---|---|
| 0 | 小兔 | 1820 | 910.0 |
| 1 | 小狗 | 1711 | 855.5 |
| 2 | 小猫 | 1670 | 835.0 |
| 3 | 小花 | 1861 | 930.5 |
| 4 | 小草 | 1825 | 912.5 |
| 5 | 小鸭 | 1719 | 859.5 |
2.2 方法二(使用group by+agg)
total_mean = df.groupby("students").agg(total_money=("money", "sum"),mean_money=("money", "mean")).reset_index()
total_mean
| students | total_money | mean_money | |
|---|---|---|---|
| 0 | 小兔 | 1820 | 910.0 |
| 1 | 小狗 | 1711 | 855.5 |
| 2 | 小猫 | 1670 | 835.0 |
| 3 | 小花 | 1861 | 930.5 |
| 4 | 小草 | 1825 | 912.5 |
| 5 | 小鸭 | 1719 | 859.5 |
3. group by+多个字段+单个聚合
3.1 方法一
df.groupby(["students","grade"])["money"].sum().reset_index()
| students | grade | money | |
|---|---|---|---|
| 0 | 小兔 | 初中部 | 1820 |
| 1 | 小狗 | 初中部 | 843 |
| 2 | 小狗 | 小学部 | 868 |
| 3 | 小猫 | 小学部 | 1670 |
| 4 | 小花 | 初中部 | 910 |
| 5 | 小花 | 小学部 | 951 |
| 6 | 小草 | 初中部 | 1825 |
| 7 | 小鸭 | 初中部 | 1719 |
3.2 方法二(使用agg)
df.groupby(["students","grade"]).agg({"money":"sum"}).reset_index()
| students | grade | money | |
|---|---|---|---|
| 0 | 小兔 | 初中部 | 1820 |
| 1 | 小狗 | 初中部 | 843 |
| 2 | 小狗 | 小学部 | 868 |
| 3 | 小猫 | 小学部 | 1670 |
| 4 | 小花 | 初中部 | 910 |
| 5 | 小花 | 小学部 | 951 |
| 6 | 小草 | 初中部 | 1825 |
| 7 | 小鸭 | 初中部 | 1719 |
4. group by+多个字段+多个聚合
agg函数的使用的方法是:agg(新列名=("原列名", "统计函数"))
df.groupby(["students","grade"]).agg(total_money=("money", "sum"),mean_money=("money", "mean"),total_score=("score", "sum")).reset_index()
| students | grade | total_money | mean_money | total_score | |
|---|---|---|---|---|---|
| 0 | 小兔 | 初中部 | 1820 | 910.0 | 192 |
| 1 | 小狗 | 初中部 | 843 | 843.0 | 88 |
| 2 | 小狗 | 小学部 | 868 | 868.0 | 93 |
| 3 | 小猫 | 小学部 | 1670 | 835.0 | 178 |
| 4 | 小花 | 初中部 | 910 | 910.0 | 95 |
| 5 | 小花 | 小学部 | 951 | 951.0 | 98 |
| 6 | 小草 | 初中部 | 1825 | 912.5 | 184 |
| 7 | 小鸭 | 初中部 | 1719 | 859.5 | 173 |
5. transform函数
5.1 方法一(使用groupby + merge)
df_1 = df.groupby("grade")["score"].mean().reset_index()
df_1.columns = ["grade", "average_score"]
df_1
| grade | average_score | |
|---|---|---|
| 0 | 初中部 | 85.00 |
| 1 | 小学部 | 88.25 |
df_new1 = pd.merge(df, df_1, on="grade")
df_new1
| students | grade | sex | score | money | average_score | |
|---|---|---|---|---|---|---|
| 0 | 小狗 | 小学部 | female | 95 | 844 | 88.25 |
| 1 | 小猫 | 小学部 | male | 93 | 836 | 88.25 |
| 2 | 小兔 | 小学部 | female | 90 | 931 | 88.25 |
| 3 | 小花 | 小学部 | male | 81 | 853 | 88.25 |
| 4 | 小草 | 小学部 | male | 80 | 991 | 88.25 |
| 5 | 小猫 | 小学部 | male | 93 | 886 | 88.25 |
| 6 | 小鸭 | 小学部 | male | 88 | 983 | 88.25 |
| 7 | 小兔 | 小学部 | male | 86 | 891 | 88.25 |
| 8 | 小鸭 | 初中部 | male | 83 | 854 | 85.00 |
| 9 | 小狗 | 初中部 | female | 81 | 854 | 85.00 |
| 10 | 小花 | 初中部 | male | 92 | 830 | 85.00 |
| 11 | 小草 | 初中部 | male | 84 | 948 | 85.00 |
5.2 方法二(使用groupby + map)
dic = df.groupby("grade")["score"].mean().to_dict()
dic
{'初中部': 85.0, '小学部': 88.25}
df_new1["average_map_score"] = df["grade"].map(dic)
df_new1
| students | grade | sex | score | money | average_score | average_map_score | |
|---|---|---|---|---|---|---|---|
| 0 | 小狗 | 小学部 | female | 95 | 844 | 88.25 | 88.25 |
| 1 | 小猫 | 小学部 | male | 93 | 836 | 88.25 | 88.25 |
| 2 | 小兔 | 小学部 | female | 90 | 931 | 88.25 | 85.00 |
| 3 | 小花 | 小学部 | male | 81 | 853 | 88.25 | 88.25 |
| 4 | 小草 | 小学部 | male | 80 | 991 | 88.25 | 88.25 |
| 5 | 小猫 | 小学部 | male | 93 | 886 | 88.25 | 88.25 |
| 6 | 小鸭 | 小学部 | male | 88 | 983 | 88.25 | 85.00 |
| 7 | 小兔 | 小学部 | male | 86 | 891 | 88.25 | 88.25 |
| 8 | 小鸭 | 初中部 | male | 83 | 854 | 85.00 | 88.25 |
| 9 | 小狗 | 初中部 | female | 81 | 854 | 85.00 | 88.25 |
| 10 | 小花 | 初中部 | male | 92 | 830 | 85.00 | 85.00 |
| 11 | 小草 | 初中部 | male | 84 | 948 | 85.00 | 85.00 |
5.3 方法三(使用transform一步到位)
df_new1["average_trans_score"] = df.groupby("grade")["score"].transform("mean")
df_new1
| students | grade | sex | score | money | average_score | average_map_score | average_trans_score | |
|---|---|---|---|---|---|---|---|---|
| 0 | 小狗 | 小学部 | female | 95 | 844 | 88.25 | 88.25 | 88.25 |
| 1 | 小猫 | 小学部 | male | 93 | 836 | 88.25 | 88.25 | 88.25 |
| 2 | 小兔 | 小学部 | female | 90 | 931 | 88.25 | 85.00 | 85.00 |
| 3 | 小花 | 小学部 | male | 81 | 853 | 88.25 | 88.25 | 88.25 |
| 4 | 小草 | 小学部 | male | 80 | 991 | 88.25 | 88.25 | 88.25 |
| 5 | 小猫 | 小学部 | male | 93 | 886 | 88.25 | 88.25 | 88.25 |
| 6 | 小鸭 | 小学部 | male | 88 | 983 | 88.25 | 85.00 | 85.00 |
| 7 | 小兔 | 小学部 | male | 86 | 891 | 88.25 | 88.25 | 88.25 |
| 8 | 小鸭 | 初中部 | male | 83 | 854 | 85.00 | 88.25 | 88.25 |
| 9 | 小狗 | 初中部 | female | 81 | 854 | 85.00 | 88.25 | 88.25 |
| 10 | 小花 | 初中部 | male | 92 | 830 | 85.00 | 85.00 | 85.00 |
| 11 | 小草 | 初中部 | male | 84 | 948 | 85.00 | 85.00 | 85.00 |


![【蓝桥每日一题]-前缀和与差分(保姆级教程 篇3)#涂国旗 #重新排序](https://img-blog.csdnimg.cn/a9fe4a31c8dd48ae948fd7ea4ebf4c01.png)
















