【pandas技巧】group by+agg+transform函数
目录
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 |