2016-11-29 5 views
0

Ich verwende eine Aggregationsfunktion nach dem groupby auf einem Pandas Datenrahmen zu tun, wie:Python - Pandas Datenrahmen: benutzerdefinierte Aggregationsfunktion nach groupy?

my_df.groupby(['id']).agg(['count']) 

Ich frage mich, ist es möglich, eine maßgeschneiderte Aggregationsfunktion zu haben? Zum Beispiel in meinem Datenrahmen:

id  color 
--------------------  
001  red 
001  blue 
001  yellow 
002  green 
002  black 
003  yellow 
003  white 
003  blue 

Ich möchte eine benutzerdefinierte Funktion all_color genannt schaffen, so konnte ich so etwas wie tun:

: als

my_df.groupby(['id']).agg(['all_color']) 

und erhalten die Ausgangsdatenrahmen

id  all_color 
-------------------- 
001  [red,blue,yellow] 
002  [green,black] 
003  [yellow,white,blue] 

Antwort

1

Verwenden Sie apply Funktion und tolist() Methode, um Werte in Liste zu konvertieren.

In [12]: df.groupby('id')['color'].apply(lambda x: x.tolist()) 
Out[12]: 
id 
1  [red, blue, yellow] 
2   [green, black] 
3 [yellow, white, blue] 
Name: color, dtype: object 

Verwenden reset_index die Serie zu konvertieren

In [21]: df.groupby('id')['color'].apply(lambda x: x.tolist()).reset_index() 
Out[21]: 
    id     color 
0 1 [red, blue, yellow] 
1 2   [green, black] 
2 3 [yellow, white, blue] 
+0

Danke! Dann scheint die Ausgabe kein Datenrahmen zu sein, können wir es zu einem Datenrahmen machen? Vielen Dank! – Edamame

+0

Oder weisen Sie der neuen Spalte zumindest einen Namen zu, damit Sie später darauf verweisen können ... Danke. – Edamame

+0

Aktualisiert, um Serien in Dataframe umzuwandeln. – Zero

0

zu Datenrahmen Wenn Sie dies als ein Datenrahmen können Sie pivot_table verwenden:

In [11]: pd.pivot_table(df, values="id", index=df["id"], columns=df["color"], aggfunc='count', fill_value=0) 
Out[11]: 
color black blue green red white yellow 
id 
1   0  1  0 1  0  1 
2   1  0  1 0  0  0 
3   0  1  0 0  1  1 

Hinweis: Dies ist sehr ähnlich zu dem Ausgang von get_dummies.

Verwandte Themen