2017-02-23 12 views
6

Mam df, który należy zgrupować, przefiltrować, zmodyfikować i zastosować niestandardową funkcję. Moje "normalne" podejście jest powolne, a nie najbardziej eleganckie!Pandy: najbardziej efektywny sposób na zastosowanie złożonej funkcji w całej ramce danych

[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 

muszę grupy DF na [num] czyli:

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

AAAA  12 20182.0  5.0 1.75 
BBBB  12 20182.0  7.0 2.00 

Dla każdej z tych grup należy zrobić trzy zadania:

I. odfiltrować wszystkie wiersze wewnątrz jednego grupa o tej samej wartości [y]. Grupy mogą składać się z maksymalnie 6 wartości.

II. Utwórz wszystkie możliwe podzbiory, o długości dwóch, dla [miejsce]: (5,7) i (7,5)

III. Zastosuj funkcję niestandardową do każdego podzbioru:

def func(p1, p2): 

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

Gdzie p1 = pierwsze miejsce krotki; p2 = drugie miejsce krotki; 12 to wartość z kolumny [cnt]. Co daje w grupie przykład:

[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 

aaaa za [życzenia] kolumna posiada średni wynik funkcji „zwyczaj” wszystkich podzbiorów gdzie wartość miejsce AAAA jest pierwszą częścią krotki. Co jest tylko jedną krotką w tym przykładzie.

(Ale jak wymienione grupy może składać się maksymalnie z 6 wartości, które będą tworzyć wiele krotki gdzie miejsce AAAA jest pierwsza wartość)

Moje obecne podejście jest zrobić

DF. GroupBy ('num') stosuje się (...)

zastosować zrobi.

.drop_ duplikaty ('y', zachować = False)

lista (itertools.permutations (df_grp.place.values, 2))

zastosować funkcję niestandardową

.mean()

Po pewnym czasie staje się naprawdę bardzo powolny, ponieważ pierwszy df jest wynikiem działania innego .groupby(). Apply() zadzwoń

+0

"Odfiltruj wszystkie wiersze w obrębie jednej grupy o tej samej wartości [y]". W jaki sposób decydujesz, które z duplikatów zachować, a które odrzucić (np. Te same wartości liczbowe i y, ale inne wartości miejsc)? Podobnie, w jaki sposób decydujesz, które z nich zachować, jeśli w grupie jest więcej niż 6? Możesz zepsuć ten problem na mniejsze kawałki. – Alexander

Odpowiedz

1

Wypróbuj GroupBy.aggregate(func, *args, **kwargs)[source], aby zebrać wszystkie trzy zadania.

Powiązane problemy