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

Python 考虑到每个计数,重新计算平均值,python,pandas,dataframe,group-by,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

如果数据帧如下所示

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只考虑专业

例如,对于主b,在不同的时间有2个数据

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

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


有办法解决这个问题吗?

一种懒惰的方法,因为学生的数量是整数

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

选项2
groupby().apply()
np.平均值

(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