したがって、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の生のループよりもエレガントな方法があるはずだということを知っていますか?
これによると thread on pandas githubtransform()
メソッドを使用して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 method chaining を使用しています。メソッドチェーンを使用してdplyr
ワークフローを複製する方法の詳細については、これを参照してください blogpost 。
apply()
とgroupby()
を使用する方法は、適応性がないように見えるため、私には機能しません。たとえば、ラムダ式から_g.c/
_を削除すると機能しません。
_df['ratio'] = df.groupby(['a','b'], group_keys=False)\
.apply(lambda g: (g.c * g.d).sum() )
_