考虑每个计数重新计算平均值

时间:2021-05-05 03:03:05

标签: python pandas dataframe group-by

如果数据框如下所示

index yearmon   college major   gpa     num
0     20140401  1       a       3.36    29
1     20180401  2       b       2.63    48
2     20160401  3       c       3.23    55
3     20170401  4       d       4.22    1
4     20140401  3       b       3.72    72

其中给出了每年、每所大学、每个专业的平均 gpa。

我想制作一个新数据集作为平均gpa,只考虑专业。

例如b大调,有2个不同时间的数据,

所以我必须做一个新的 gpa平均考虑人数(学生人数)

我尝试过 groupby 函数,但它只是平均,因为它们具有相同的 num 计数(不考虑 num 变量)

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

一个懒惰的方法,鉴于学生人数是整数,

(df.loc[df.index.repeat(df['num']), ['major', 'gpa']]
   .groupby('major').mean()
)

选项 2 groupby().apply()np.average

(df.groupby('major')
   .apply(lambda x: np.average(x['gpa'], weights=x['num']))
)

选项 3 最复杂但性能最好的是分配总分,并手动计算平均值:

df['total'] = df['gpa'] * df['num']
groups = df.groupby('major')
out = groups['total'].sum()/groups['num'].sum()

输出

         gpa
major       
a      3.360
b      3.284
c      3.230
d      4.220