取下表:
df = pd.DataFrame({'a':[1,1,2,2], 'b':[1,2,3,4], 'c':[10,20,30,40]})
print(df.to_string())
a b c
0 1 1 10
1 1 2 20
2 2 3 30
3 2 4 40
我想要以下结果:
result = pd.DataFrame({'a':[1,1,2,2], 'b':[1,2,3,4], 'c':[10,20,30,40], 'group_avg':[13.5,13.5,31.5,31.5]})
print(result.to_string())
a b c group_avg
0 1 1 10 13.5
1 1 2 20 13.5
2 2 3 30 31.5
3 2 4 40 31.5
也就是说,group_avg是通过c-b进行计算,然后通过对a进行分组来取平均值。
是否有一种不错的方法,还是我必须采用回旋方式创建一个新的差异列,按a分组,获取平均值,然后将结果加入原始表中?
如果我想应用一个需要2个序列的任意函数,但又想逐组应用该怎么办?
答案 0 :(得分:3)
尝试使用assign
创建c-b的临时列,然后使用groupby
和transform
:
df['group_avg'] = df.assign(avg = df.c - df.b)\
.groupby('a')['avg'].transform('mean')
输出:
a b c group_avg
0 1 1 10 13.5
1 1 2 20 13.5
2 2 3 30 31.5
3 2 4 40 31.5
答案 1 :(得分:1)
由于mean
的线性性质,差异的平均值与平均值的差异相同。因此,我们可以在mean
之后使用groupby
,然后减去。
df.join(df.groupby('a').mean().eval('c - b').rename('avg'), on='a')
a b c avg
0 1 1 10 13.5
1 1 2 20 13.5
2 2 3 30 31.5
3 2 4 40 31.5