![](/img/trans.png)
[英]Groupby mutate equivalent in pandas/python using tidydata principles
[英]Python pandas equivalent to R groupby mutate
所以在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中应该有一个比raw循环更优雅的方式,任何人都有任何想法?
根据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表达式中删除gc/
,它就不起作用。
df['ratio'] = df.groupby(['a','b'], group_keys=False)\
.apply(lambda g: (g.c * g.d).sum() )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.