【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

【pandas技巧】group by+agg+transform函数_第1张图片

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

你可能感兴趣的:(数据分析,pandas,数据分析)