如何以分组方式进行计算来更新熊猫数据框?

时间:2019-04-10 15:41:30

标签: python pandas

取下表:

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个序列的任意函数,但又想逐组应用该怎么办?

2 个答案:

答案 0 :(得分:3)

尝试使用assign创建c-b的临时列,然后使用groupbytransform

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