2017-05-01 15 views
1

Ich möchte ein Aggregat, gruppiert, Nunique Spalte zu meinem Pandas Dataframe hinzufügen, aber nicht den gesamten Datenrahmen aggregieren. Ich versuche, dies in einer Zeile zu tun und vermeiden, ein neues aggregiertes Objekt zu erstellen und das usw. zu verschmelzen.Hinzufügen einer gruppierten, aggregierten Nunique-Spalte zu Pandas Dataframe

mein df hat Track, Typ und ID. Ich möchte die Anzahl der eindeutigen IDs für jede Track/Typ-Kombination als eine neue Spalte in der Tabelle (aber nicht zusammenfassen Track/Typ Combos in der resultierenden df). Gleiche Anzahl von Zeilen, 1 weitere Spalte.

so etwas wie dies funktioniert nicht:

df['n_unique_id'] = df.groupby(['track', 'type'])['id'].nunique() 

noch ist

df['n_unique_id'] = df.groupby(['track', 'type'])['id'].transform(nunique) 

diese letzte mit einigen Aggregatfunktionen arbeitet, andere aber nicht. die folgenden Werke (ist aber auf meinem Dataset sinnlos):

df['n_unique_id'] = df.groupby(['track', 'type'])['id'].transform(sum) 

in R ist dies leicht in data.table getan mit

df[, n_unique_id := uniqueN(id), by = c('track', 'type')] 

Dank!

+0

eine Kopie Ihrer Quelle Datenrahmen einfügen können und was die erwartete Ausgabe aussehen sollte? –

Antwort

2
df.groupby(['track', 'type'])['id'].transform(nunique) 

bedeutet, dass es einen Namen nunique im Namensraum ist, die eine Funktion ausführt. transform nimmt eine Funktion oder eine Zeichenfolge an, für die sie eine Funktion kennt. nunique ist definitiv eine dieser Saiten.

Wie von @root aufgezeigt, wird oft die Methode, die pandas verwendet, um eine Transformation durch diese Strings angezeigt werden, optimiert werden und sollte in der Regel vor Weitergabe Ihrer eigenen Funktionen bevorzugt werden. Dies ist True sogar für die Weitergabe von numpy Funktionen in einigen Fällen.

Zum Beispiel transform('sum') sollte gegenüber transform(sum) bevorzugt werden.

diese stattdessen versuchen

df.groupby(['track', 'type'])['id'].transform('nunique') 

Demo

df = pd.DataFrame(dict(
    track=list('11112222'), type=list('AAAABBBB'), id=list('XXYZWWWW'))) 
print(df) 

    id track type 
0 X  1 A 
1 X  1 A 
2 Y  1 A 
3 Z  1 A 
4 W  2 B 
5 W  2 B 
6 W  2 B 
7 W  2 B 

df.groupby(['track', 'type'])['id'].transform('nunique') 

0 3 
1 3 
2 3 
3 3 
4 1 
5 1 
6 1 
7 1 
Name: id, dtype: int64 
+3

Ich war gerade dabei, dies zu kommentieren. Es kann nützlich sein, zu erwähnen, dass die String-Aliase in der Regel bevorzugt werden sollten, wenn sie verfügbar sind, da sie optimale Funktionen referenzieren, z. '.transform (sum)' verwendet python 'sum', während' .transfrom ('sum') 'würde numpy verwenden und recheneffizienter sein. – root

Verwandte Themen