相当于 R groupby 变异的 Python pandas

新手上路,请多包涵

所以在 R 中,当我有一个由 4 列组成的数据框时,将其称为 df 并且我想通过一组的和乘积来计算比率,我可以这样计算:

 // generate data
df = data.frame(a=c(1,1,0,1,0),b=c(1,0,0,1,0),c=c(10,5,1,5,10),d=c(3,1,2,1,2));
| a   b   c    d |
| 1   1   10   3 |
| 1   0   5    1 |
| 0   0   1    2 |
| 1   1   5    1 |
| 0   0   10   2 |
// compute sum product ratio
df = df%>% group_by(a,b) %>%
      mutate(
          ratio=c/sum(c*d)
      );
| a   b   c    d  ratio |
| 1   1   10   3  0.286 |
| 1   1   5    1  0.143 |
| 1   0   5    1  1     |
| 0   0   1    2  0.045 |
| 0   0   10   2  0.454 |

但是在 python 中,我需要求助于循环。我知道应该有比 python 中的原始循环更优雅的方法,有人有什么想法吗?

原文由 asosnovsky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 412
2 个回答

根据 pandas github 上的这个线程, 我们可以使用 transform() 方法来复制 dplyr::groupby()dplyr::mutate() 的组合对于此示例,它将如下所示:

 df = pd.DataFrame(
    dict(
        a=(1 , 1, 0, 1, 0 ),
        b=(1 , 0, 0, 1, 0 ),
        c=(10, 5, 1, 5, 10),
        d=(3 , 1, 2, 1, 2 ),
    )
).assign(
    prod_c_d = lambda x: x['c'] * x['d'],
    ratio    = lambda x: x['c'] / (x.groupby(['a','b']).transform('sum')['prod_c_d'])
)

此示例使用 pandas 方法链接。有关如何使用方法链复制 dplyr 工作 流的更多信息,请参阅此博文。

使用 apply()groupby() 的方法对我不起作用,因为它似乎不适应。例如,如果我们从 lambda 表达式中删除 g.c/ 它就不起作用了。

 df['ratio'] = df.groupby(['a','b'], group_keys=False)\
    .apply(lambda g: (g.c * g.d).sum() )

原文由 datistics 发布,翻译遵循 CC BY-SA 4.0 许可协议

可以使用 groupby()apply() 类似的语法来完成:

 df['ratio'] = df.groupby(['a','b'], group_keys=False).apply(lambda g: g.c/(g.c * g.d).sum())

在此处输入图像描述

原文由 Psidom 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题