2016-08-12 4 views
0

Ich habe einen Datenrahmen, auf dem ich laufen:Wie erzeuge ich neue Spalten mit pandas groupby & aggregate?

df.groupby(by="mycol").agg({"colA": "sum", "colB": "count"}) 

jedoch colA und colB müssen vorhanden sein. Was ist der "pandäische" Ansatz zum Erstellen neuer Spalten aus einer Aggregation?

Edit:

Grundsätzlich habe ich eine Reihe von Säulen und meine Aggregationen sind keine 1: 1-Abbildung. Betrachten Sie ein Beispiel, in dem ich das Verhältnis der Werte zweier Spalten als neue Spalte aggregieren möchte. Denken Sie nun an ein Wörterbuch solcher Abbildungen.

Ich weiß, dass ich in dem Beispiel nur für play filtern und dann den Mittelwert für die gruppierten Daten berechnen konnte. Aber das ist nicht der Punkt der Frage, also ignorieren Sie bitte diese einfache Lösung, die nur ein Nebeneffekt des einfachen Beispiels ist.

>> df 
    outlook play temperature 
0  sunny True   25 
1  sunny True   25 
2 overcast True   19 
3  rain False   21 
4 overcast False   33 
5  rain False   27 
6  rain False   22 
7 overcast True   26 
8  sunny True   13 
9  sunny True   16 

# should become: 
>> df.groupby(by="outlook").agg(?) 
     play_mean_temp 
sunny 19.75 
overcast 22.50 
rain  NaN 
+0

Benötigen Sie 'df.groupby (von =" mycol ") .agg (['sum', 'count'])'? – jezrael

+0

Können Sie Beispieldaten und die gewünschte Ausgabe hinzufügen? – jezrael

+0

@jezrael hinzugefügt wie gewünscht. Danke für Ihre Hilfe! – Xiphias

Antwort

1

In Ihrer Probe können Sie:

print (df.groupby(by="outlook").apply(lambda x: x.ix[x.play, 'temperature'].mean())) 
outlook 
overcast 22.50 
rain   NaN 
sunny  19.75 

Wenn die Verwendung zunächst boolean Indizierung werden einige Zeilen auslassen:

print (df[df.play].groupby(by="outlook")['temperature'].mean()) 
outlook 
overcast 22.50 
sunny  19.75 
Name: temperature, dtype: float64 
+0

Das ist wunderbar. Noch eine Sache: Wenn ich zwei Aggregationen habe, wie würde ich sie in einen DataFrame bekommen? Sie haben mir hier eine Serie, aber sagen wir, ich habe zwei dieser Aggregationen aus den gleichen Rohdaten. Was würde ich tun? – Xiphias

+1

Dann können Sie die benutzerdefinierte Funktion verwenden und einen neuen 'DataFrame' zurückgeben, siehe [docs] (http://pandas.pydata.org/pandas-docs/stable/groupby.html#flexible-apply). – jezrael

+1

Ich denke 'In [117]' in 'docs.' – jezrael