grouped = df.groupby(keys)

def wavg(group):
    d = group['data']
w = group['weights']
return (d * w).sum() / w.sum()
grouped.apply(wavg)
Агрегатная функция Pandas DataFrame с использованием нескольких столбцов