Es ist möglich, eine beliebige Anzahl von aggregierten Werten von einem groupby-Objekt mit zurückzugeben apply
. Geben Sie einfach eine Serie zurück und die Indexwerte werden zu den neuen Spaltennamen.
Sehen wir uns ein kurzes Beispiel an:
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
Definieren Sie eine benutzerdefinierte Funktion, an die übergeben wird apply
. Es akzeptiert implizit einen DataFrame - was bedeutet, dass der data
Parameter ein DataFrame ist. Beachten Sie, wie mehrere Spalten verwendet werden, was mit der agg
groupby-Methode nicht möglich ist :
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)
Rufen Sie die groupby- apply
Methode mit unserer benutzerdefinierten Funktion auf:
df.groupby('group').apply(weighted_average)
d1_wa d2_wa
group
a 9.0 2.2
b 58.0 13.2
Sie können eine bessere Leistung erzielen, indem Sie die gewichteten Summen wie in anderen Antworten erläutert in neue DataFrame-Spalten vorberechnen und die Verwendung apply
insgesamt vermeiden .