使用 apply
方法可以从分组对象返回任意数量的聚合值。只需返回一个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
。