2017-02-23 25 views
6

Tôi có df cần được nhóm, lọc, sửa đổi và áp dụng chức năng tùy chỉnh. Cách tiếp cận 'bình thường' của tôi là chậm và không phải là cách thanh lịch nhất!Pandas: cách hiệu quả nhất để áp dụng chức năng phức tạp trên toàn bộ khung dữ liệu

[name] [cnt] [num] [place] [y] 

AAAA  12 20182.0  5.0 1.75 
BBBB  12 20182.0  7.0 2.00 
AAAA  10 20381.0 10.0 9.25 
BBBB  10 20381.0 12.0 18.75 
EEEE  12 21335.0  1.0 0.00 
RRRR  12 21335.0  8.0 3.00 
CCCC  12 21335.0  9.0 3.50 

tôi cần phải nhóm df trên [num] ví dụ:

[name] [cnt] [num] [place] [y] 

AAAA  12 20182.0  5.0 1.75 
BBBB  12 20182.0  7.0 2.00 

Đối với mỗi nhóm tôi cần phải làm ba nhiệm vụ:

I. Lọc ra tất cả các hàng bên trong một nhóm có cùng giá trị [y]. Các nhóm có thể bao gồm tối đa 6 giá trị.

II. Tạo tất cả các tập con có thể, với độ dài hai, cho [vị trí]: (5,7) và (7,5)

III. Áp dụng chức năng tùy chỉnh cho mỗi tập hợp con:

def func(p1, p2): 

    diff_p = p2-p1 
    if diff_p > 0: 
     return 2/(diff_p * p2) 
    else: 
     return p1/(diff_p * 12) 

Nơi p1 = vị trí đầu tiên của bộ dữ liệu; p2 = vị trí thứ hai của tuple; 12 là giá trị từ cột [cnt]. Công cụ này cung cấp cho nhóm ví dụ:

[name] [cnt] [num] [place] [y] [desired] 

AAAA  12 20182.0  5.0 1.75 0.1428571429 
BBBB  12 20182.0  7.0 2.00 -0.2916666667 

Cột [mong muốn] của AAAA giữ kết quả chức năng tùy chỉnh 'của tất cả các tập con mà giá trị vị trí của AAAA là phần đầu tiên của bộ. Đó chỉ là một tuple trong ví dụ này.

(Nhưng như đã đề cập các nhóm có thể bao gồm lên đến 6 giá trị, mà sẽ tạo nhiều tuples nơi nơi AAAA là giá trị đầu tiên)

cách tiếp cận hiện tại của tôi là để làm một df

. groupby ('num') áp dụng (...)

áp dụng sẽ làm:.

.drop_ bản sao ('y', giữ = False)

danh sách (itertools.permutations (df_grp.place.values, 2))

áp dụng các chức năng tùy chỉnh

.mean()

Nó trở nên thực sự rất chậm sau một thời gian kể từ khi df đầu tiên là đầu ra từ một nhóm khác .groupby(). Apply() gọi

+0

"Lọc tất cả các hàng bên trong một nhóm có cùng giá trị [y]". Bạn làm cách nào để quyết định loại bản sao nào cần giữ lại và loại bỏ nào (ví dụ: giá trị num và y, nhưng giá trị địa điểm khác nhau)? Tương tự như vậy, làm thế nào để bạn quyết định cái nào để giữ nếu có nhiều hơn 6 trong một nhóm? Bạn có thể chia nhỏ vấn đề này thành từng phần nhỏ hơn. – Alexander

Trả lời

1

Hãy thử GroupBy.aggregate(func, *args, **kwargs)[source] để tổng hợp ba nhiệm vụ của bạn.

Các vấn đề liên quan