如果数据框如下所示
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 变量)
有没有办法解决这个问题?
答案 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