2014-02-28 5 views
16

Was wäre der effizienteste Weg, groupby zu verwenden und parallel einen Filter in Pandas anzuwenden?Pandas: Was ist das Äquivalent von SQL-Gruppe mit?

Grundsätzlich für das Äquivalent in SQL von

Ich frage
select * 
... 
group by col_name 
having condition 

Ich denke, es gibt viele Einsatzfälle reichen von bedingten Mittel, Summen, bedingten Wahrscheinlichkeiten usw., die ein solcher Befehl würde sehr mächtig.

Ich brauche eine sehr gute Leistung, also wäre ein solcher Befehl im Idealfall nicht das Ergebnis mehrerer geschichtet Operationen in Python.

+6

@AndyHayden hat ein [nettes Beispiel] (http://stackoverflow.com/a/18357933/190597) von 'groupby-filter' geschrieben. Ich denke, der "Filter" ist das Pandas-Äquivalent der "Haben-Bedingung". – unutbu

Antwort

19

Wie in unutbu Kommentar erwähnt, groupby's filter ist die äquivalent von SQL hat die:

In [11]: df = pd.DataFrame([[1, 2], [1, 3], [5, 6]], columns=['A', 'B']) 

In [12]: df 
Out[12]: 
    A B 
0 1 2 
1 1 3 
2 5 6 

In [13]: g = df.groupby('A') # GROUP BY A 

In [14]: g.filter(lambda x: len(x) > 1) # HAVING COUNT(*) > 1 
Out[14]: 
    A B 
0 1 2 
1 1 3 

Sie kompliziertere Funktionen schreiben können (diese auf jede Gruppe angewandt werden), sofern sie eine Ebene zurückkehren ol‘Bool:

In [15]: g.filter(lambda x: x['B'].sum() == 5) 
Out[15]: 
    A B 
0 1 2 
1 1 3 

Hinweis: potentially there is a bug, wo Sie nicht schreiben können Sie sich auf die Spalten handeln Funktion, die Sie verwendet haben, um GROUPBY ... eine Abhilfe ist die groupby die Spalten manuell dh g = df.groupby(df['A'])).

+0

vielleicht zum Vergleich mit SQL-Abschnitt hinzufügen? (dieses Beispiel) – Jeff

+1

@Jeff guten Ruf, schau es an, ich frage mich, ob sollte über Beispiel der Verwendung von agg * und * Filter zur gleichen Zeit denken (ich glaube nicht, dass es eine Möglichkeit gibt, das leicht zu tun, ohne eine Sekunde zu tun groupby ...) das könnte diese Frage sein: s –

+2

just chain em (aber du brauchst eine zweite groupby): '' DataFrame ([[1, 2], [1, 3], [2, 5], [ 2, 8], [5, 6]], Spalten = ['A', 'B']) .groupby ('A') .filter (Lambda x: len (x)> 1) .groupby ('A') .sum() '' – Jeff

Verwandte Themen