首页 > 解决方案 > 是否可以使用函数返回系列而不是缩放器获得“groupby-transform-apply”样式的结果?

问题描述

我想实现以下行为:

res = df.groupby(['dimension'], as_index=False)['metric'].transform(lambda x: foo(x))  

其中 foo(x) 返回与输入相同大小的系列,即 df['metric']
但是,这将引发以下错误:
ValueError: transform must return a scalar value for each group

我知道我可以使用 for 循环样式,但是如何以 groupby 方式实现这一点?

例如

df:
   col1 col2 col3
0   A1  B1  1
1   A1  B1  2
2   A2  B2  3  

我想实现:

   col1 col2 col3
0   A1  B1  1 - (1+2)/2
1   A1  B1  2 - (1+2)/2
2   A2  B2  3 - 3

标签: pandaspandas-groupby

解决方案


您可以使用以下方法执行此操作transform

df['col3']=(df.col3-df.groupby(['col1','col2'])['col3'].transform('sum'))/2

或使用apply(较慢):

df['col3']=df.groupby(['col1','col2'])['col3'].apply(lambda x: (x-x.sum())/2)

  col1 col2  col3
0   A1   B1  -1.0
1   A1   B1  -0.5
2   A2   B2   0.0

推荐阅读