使用可以从groupby对象返回任意数量的聚合值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。请注意,它如何使用多列,而agggroupby方法是不可能的:
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)
apply使用我们的自定义函数调用groupby方法:
df.groupby('group').apply(weighted_average)
       d1_wa  d2_wa
group              
a        9.0    2.2
b       58.0   13.2
如其他答案中所述,可以通过将加权总数预先计算到新的DataFrame列中来获得更好的性能,并避免apply完全使用。