pandas - 是否可以使用函数返回系列而不是缩放器获得“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
解决方案
您可以使用以下方法执行此操作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
推荐阅读
- r - R:如何根据其他四个变量的百分比创建一个新变量?
- python - 访问我自己的图像文件或将它们从 S3 加载到 phoneoxpth 到 sage maker
- java - 如何使工具栏留在屏幕上?
- php - 我怎样才能记住输入中的文本
- javascript - 来自 PHP Ajax 的 Fullcalendar 的 eventSources 选项值
- firebase - 如何从firebase(颤振)将数组数据返回到移动屏幕
- angular - 如何更新整个收藏?Firebase 数据库迁移
- azure-cosmosdb - cosmos db 多访问条件
- javascript - 传单起始位置
- javascript - 在数组中查找重复值时遇到问题