Donc dans R quand j'ai un bloc de données composé de disons 4 colonnes, appelez-le df
et que je veux calculer le rapport par produit de somme d'un groupe, je peux le faire de cette manière:
// 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 |
Mais en python j'ai besoin de recourir à des boucles. Je sais qu'il devrait y avoir une manière plus élégante que les boucles brutes en python, quelqu'un a-t-il des idées?
Selon cela thread sur pandas github nous pouvons utiliser la méthode transform()
pour répliquer la combinaison de dplyr::groupby()
et dplyr::mutate()
. Pour cet exemple, il ressemblerait à ceci:
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'] )
Cet exemple utilise chaînage de la méthode pandas . Pour plus d'informations sur l'utilisation du chaînage de méthodes pour répliquer les workflows dplyr
, consultez ceci blogpost .
La méthode utilisant apply()
et groupby()
ne fonctionne pas pour moi car elle ne semble pas être adaptable. Par exemple, cela ne fonctionne pas si nous supprimons g.c/
De l'expression lambda.
df['ratio'] = df.groupby(['a','b'], group_keys=False)\
.apply(lambda g: (g.c * g.d).sum() )