2016-03-06 23 views
5

Podczas wykonywania filtru na wynik operacji grupowania Pandy zwraca ramkę danych. Ale zakładając, że chcę wykonać dalsze obliczenia grupowe, muszę ponownie zadzwonić do groupby, co wydaje mi się dość okrągłe. Czy istnieje bardziej idiomatyczny sposób robienia tego?Jak mogę filtrować obiekt Pandas GroupBy i odzyskać obiekt GroupBy?

EDIT:

Aby zilustrować to, co mówię:

Mamy bezczelnie kraść dataframe zabawka z docs Pandy i grupa:

>>> dff = pd.DataFrame({'A': np.arange(8), 'B': list('aabbbbcc')}) 
>>> grouped = dff.groupby('B') 
>>> type(grouped) 
<class 'pandas.core.groupby.DataFrameGroupBy'> 

Zwraca GroupBy obiekt, nad którym możemy dokonywać iteracji, wykonywać operacje grupowe itp. Ale jeśli filtrujemy:

>>> filtered = grouped.filter(lambda x: len(x) > 2) 
>>> type(filtered) 
<class 'pandas.core.frame.DataFrame'> 

Otrzymujemy z powrotem ramkę danych. Czy istnieje ładny idiomatyczny sposób na odzyskanie odfiltrowanych grup zamiast samych oryginalnych wierszy należących do filtrowanych grup?

+1

Podaj przykład tego, o czym mówisz. – BrenBarn

+1

Myślę, że jest to dobra misja, w SQL można łączyć groupby by i filter jako 'SELECT user, SUM (likes) GROUP BY user POSIADAJĄC suma (polubienia)> 10' podczas gdy w pandach trzeba zrobić' df. groupby ('user'). filter (lambda x: len (x)> 10) .groupby ('user'). likes.sum() '; może odpowiedź będzie zawierać słowo kluczowe filtr w 'groupby' lub' as_index' w 'filter'? – maxymoo

+0

@BrenBarn: przykład został dodany. –

Odpowiedz

1

Jeśli chcesz połączyć filtr i agregat, najlepszym sposobem mogę myśleć byłoby połączyć filtr i agregować stosując potrójny if wewnątrz apply, wracając None dla grup filtrowane, a następnie dropna usunąć te wiersze od wyniku końcowego:

grouped.apply(lambda x: x.sum() if len(x) > 2 else None).dropna() 

Jeśli chcąc iterację grup, powiedzmy przyłączyć je razem, można użyć zrozumieniem generator

pd.concat(g for i,g in grouped if len(g)>2) 

Ostatecznie myślę, że byłoby lepiej, gdyby groupby.filter miał opcję zwrócić obiekt groupby.

+0

Chce odzyskać rzeczywiste grupy, a nie ich sumę. – BrenBarn