PandasでWindow関数(行を残す集約:partition)を再現したい(transformを使う)

Window関数の中には、行を集約せず、集計結果を横に残す計算をすることがあります。

sum(col) over(partition by group_col)

これをPandasで行うにはtransformを使います。
(あまりよくない方法として、集計をしたものをjoinする方法もあります)

transformを使う方法

import pandas as pd

#カテゴリと集約用のカラムを持つデータをつくる
d = {"c": [random.choice(['a','b','c']) for i in range(10)],
 "n1":1,
 "n2":0.1
}
df = pd.DataFrame(d)

#n1をグループごとに合計した結果を行を集約せずつける
df['total_n_by_group'] = df.groupby('c').n1.transform(sum)

#複数データ(n1,n2)に対して、一度に処理をかける
pd.concat([
  df,
  df.groupby('c').transform(sum)
],axis=1)

よくない例としてはaggをもとにself joinするパターンがあります

df.groupby('c',as_index=False).n1.sum().merge(df,on='c')

よく使う集計としては以下があります

  • sum
  • ncount
  • min
  • max
  • mean

などなど