2016-06-06 3 views
3

in SQL würde die Abfrage wie select id, avg(x), avg(y), max(x), max(y) from table group by id aussehen kann es in eine einzige Operation auf Pandas Datenrahmen umgewandelt werden? Ich kann jede Funktion Ergebnis erhalten wieAnwenden einer Operation auf mehrere Spalten mit mehreren Spalten im Ergebnis

mydf['center_x'] = mydf.groupby('id')['x'].mean() 
mydf['center_y'] = mydf.groupby('id')['y'].mean() 

etc

aber es ist ein übermäßiger Aufruf der gleichen Operation sowie übermäßiger Speicherbedarf (mydf ist sehr groß). Außerdem ist es etwas mühsam, das einzigartige Set am Ende zu bekommen.

Irgendwelche Ideen?

+0

'agg' ist definitiv die Antwort, aber in Bezug auf Ihre letzte Aussage: Sie können s ave ein groupby-Objekt ('g = df.groupby ('id')') und dann bei Bedarf Funktionen aufrufen ('g ['x']. mean()' usw.), müssen Sie nicht jedes Mal gruppieren – ayhan

Antwort

4

Ja, dies wird unterstützt, siehe Dokumentation here.

, um von dort zu zitieren:

In [56]: grouped = df.groupby('A') 

In [57]: grouped['C'].agg([np.sum, np.mean, np.std]) 
Out[57]: 
      sum  mean  std 
A         
bar 0.443469 0.147823 0.301765 
foo 2.529056 0.505811 0.966450 

Vielleicht mehr relevant für Ihre Fragen, können Sie auch verschiedene Funktionen für verschiedene Spalten wie so tun können:

In [60]: grouped.agg({'C' : np.sum, 
    ....:    'D' : lambda x: np.std(x, ddof=1)}) 
    ....: 
Out[60]: 
      C   D 
A      
bar 0.443469 1.490982 
foo 2.529056 0.645875 

Oder ein praktisches Beispiel noch näher Ihre ursprünglichen Fragen:

df = pd.DataFrame({"group":list("aaaaabbbbb"), "A":np.random.rand(10), "B":np.random.rand(10)}) 
df.groupby("group").agg({"A":[np.sum, np.mean], "B":[np.sum, np.mean]}) 


    A    B 
    sum  mean sum  mean 
group    
a 1.450488 0.290098 3.526962 0.705392 
b 1.570386 0.314077 2.734465 0.546893 
+0

danke, Nils, sieht so aus, als ob man mehrere Funktionen kombinieren kann, die auf dieselbe Spalte angewendet werden. Aber für x und y des ursprünglichen Beispiels brauche ich immer noch zwei Selects und schließe mich ihnen an oder kann es nur eins sein? – cur4so

+0

Nicht sicher, verstehe ich - ist das nicht das zweite Beispiel? I.e. eine Funktion auf die Spalte "C" anwenden und eine auf die Spalte "D"? –

+0

ist es möglich, 2 Funktionen in Spalte C und 2 in Spalte D zu haben? Ist es möglich, 2 Beispiele zu kombinieren? Durchschnitt und Maximum für eine Spalte und Durchschnitt und Maximum für eine andere Spalte. In Ihrem zweiten Beispiel werden 'C' und 'D' sowohl Eingabe- als auch Ausgabespalten sein oder sie müssen irgendwie umbenannt werden auf Ausgabe – cur4so

Verwandte Themen