web-dev-qa-db-ja.com

Python pandas 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の生のループよりもエレガントな方法があるはずだということを知っていますか?

16
asosnovsky

groupby()およびapply()を使用して同様の構文で実行できます。

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

enter image description here

20
Psidom

これによると 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() )
_
6
datistics