Các tài liệu cho thấy cách áp dụng nhiều chức năng trên một đối tượng nhóm tại một thời điểm bằng cách sử dụng một lệnh với các tên cột đầu ra làm các khóa:
In [563]: grouped['D'].agg({'result1' : np.sum,
.....: 'result2' : np.mean})
.....:
Out[563]:
result2 result1
A
bar -0.579846 -1.739537
foo -0.280588 -1.402938
Tuy nhiên, điều này chỉ hoạt động trên một đối tượng nhóm Series. Và khi một lệnh được chuyển tương tự đến DataFrame nhóm, nó hy vọng các khóa sẽ là tên cột mà hàm sẽ được áp dụng.
Những gì tôi muốn làm là áp dụng nhiều chức năng cho một số cột (nhưng một số cột nhất định sẽ được vận hành nhiều lần). Ngoài ra, một số hàm sẽ phụ thuộc vào các cột khác trong đối tượng nhóm (như các hàm sumif). Giải pháp hiện tại của tôi là đi từng cột và làm một cái gì đó giống như mã ở trên, sử dụng lambdas cho các hàm phụ thuộc vào các hàng khác. Nhưng điều này mất nhiều thời gian, (tôi nghĩ rằng phải mất một thời gian dài để lặp qua một đối tượng nhóm). Tôi sẽ phải thay đổi nó để tôi lặp lại toàn bộ đối tượng nhóm trong một lần chạy, nhưng tôi tự hỏi liệu có một con gấu trúc nào được chế tạo để làm điều này một cách sạch sẽ không.
Ví dụ: tôi đã thử một cái gì đó như
grouped.agg({'C_sum' : lambda x: x['C'].sum(),
'C_std': lambda x: x['C'].std(),
'D_sum' : lambda x: x['D'].sum()},
'D_sumifC3': lambda x: x['D'][x['C'] == 3].sum(), ...)
nhưng như mong đợi, tôi nhận được KeyError (vì các khóa phải là một cột nếu agg
được gọi từ DataFrame).
Có cách nào được xây dựng để làm những gì tôi muốn làm không, hoặc có khả năng chức năng này có thể được thêm vào, hoặc tôi sẽ chỉ cần lặp lại thông qua nhóm theo cách thủ công?
Cảm ơn