Có thể trả về bất kỳ số lượng giá trị tổng hợp nào từ một đối tượng theo nhóm với apply
. Đơn giản, trả về một Chuỗi và các giá trị chỉ mục sẽ trở thành tên cột mới.
Hãy xem một ví dụ nhanh:
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
Xác định một chức năng tùy chỉnh sẽ được chuyển đến apply
. Nó ngầm chấp nhận một DataFrame - có nghĩa là data
tham số là một DataFrame. Lưu ý cách nó sử dụng nhiều cột, điều này không thể thực hiện được với agg
phương pháp 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)
Gọi apply
phương thức groupby với chức năng tùy chỉnh của chúng tôi:
df.groupby('group').apply(weighted_average)
d1_wa d2_wa
group
a 9.0 2.2
b 58.0 13.2
Bạn có thể có được hiệu suất tốt hơn bằng cách tính toán trước các tổng trọng số vào các cột DataFrame mới như được giải thích trong các câu trả lời khác và tránh sử dụng apply
hoàn toàn.