apply
でGROUPBYオブジェクトから集約された任意の数の値を返すことが可能です。単純にSeriesを返し、インデックス値が新しい列名になります。
はのは、簡単な例を見てみましょう:
df = pd.DataFrame({'group':['a','a','b','b'],
'd1':[5,10,100,30],
'd2':[7,1,3,20],
'weights':[.2,.8, .4, .6]},
columns=['group', 'd1', 'd2', 'weights'])
df
group d1 d2 weights
0 a 5 7 0.2
1 a 10 1 0.8
2 b 100 3 0.4
3 b 30 20 0.6
はapply
に渡されるカスタム関数を定義します。それは暗黙的にDataFrameを受け入れます - つまり、data
パラメータがDataFrameであることを意味します。 agg
GROUPBYの方法では不可能である、それは複数の列をどのように使用するかに注目してください:
def weighted_average(data):
d = {}
d['d1_wa'] = np.average(data['d1'], weights=data['weights'])
d['d2_wa'] = np.average(data['d2'], weights=data['weights'])
return pd.Series(d)
当社のカスタム関数でGROUPBY apply
メソッドを呼び出します。
df.groupby('group').apply(weighted_average)
d1_wa d2_wa
group
a 9.0 2.2
b 58.0 13.2
あなたは、重み付けをあらかじめ計算しておくことによって、より良いパフォーマンスを得ることができます他の回答で説明したように新しいDataFrame列に合計し、apply
を完全に使用しないでください。
(1)重みの列を作成する、(2)観測値を重みで正規化する、(3)重み付き観測値とグループ化した観測値の合計を計算する(4)観測の加重和を加重和で正規化する。 – kalu
wavgの多くの変数(列)を計算する場合はどうでしょうか? df ['weights']以外はすべて? – CPBL
@Wesは、 'agg()'と 'np.average(... weights = ...)'の周りに構築された 'lambda'でこれを行う方法はありますか、この投稿が最初に登場したので意味しますか? –