2017-03-14 4 views
1

Ich habe folgenden Datenrahmen my_df:Pandas: aggregieren eine Spalte einer nicht-duplizierte Sequenz zu erzeugen

name timestamp  color 
--------------------------- 
John 2017-01-01 blue 
John 2017-01-02 blue 
John 2017-01-03 blue 
John 2017-01-04 yellow 
John 2017-01-05 red 
John 2017-01-06 red 
Ann  2017-01-04 green 
Ann  2017-01-05 orange 
Ann  2017-01-06 orange 
Ann  2017-01-07 red 
Ann  2017-01-08 black 
Dan  2017-01-11 blue 
Dan  2017-01-12 blue 
Dan  2017-01-13 green 
Dan  2017-01-14 yellow 

ich dann den folgenden Code verwenden, um die Farbreihenfolge der einzelnen Person zu finden:

new_df = my_df.groupby(['name'], as_index=False).color \ 
    .agg({"color_list": lambda x: list(x)}) 

Dann new_df wie folgt aussieht:

name  color_list 
    ----------------------------------------------- 
    John  blue, blue, blue, yellow, red, red 
    Ann   green, orange, orange,red, black 
    Dan   blue, blue, green, yellow 

Allerdings, wenn ich möchte eine color_seq (keine konsekutiv doppelte Farben) anstelle von color_list wie unten, wie kann ich meinen obigen Code ändern? Vielen Dank!

name  color_seq 
    ----------------------------------------------- 
    John  blue, yellow, red 
    Ann   green, orange, red, black 
    Dan   blue, green, yellow 
+0

lambda x: set (x)? – Vaishali

+0

nein, Satz konnte die Reihenfolge der Reihenfolge nicht garantieren. – Edamame

Antwort

1

Wenn Sie nicht aufeinanderfolgende Duplikate zulassen, müssen Sie sorgfältig filtern. Ein Weg, dies zu tun:

def filter(l): 
    l.append(None) 
    return ','.join([x for (i,x) in enumerate (l[:-1]) 
    if l[i] != l[i+1]]) 

out=df.groupby('name')['color'].apply(list).apply(filter) 

für

name 
Ann  green,orange,red,black 
Dan   blue,green,yellow 
John   blue,yellow,red 
Name: color, dtype: object 
+0

Danke! Aber ich brauche die Ausgabe in einem Datenrahmenformat, und das Ergebnis als eine neue Spalte im Datenrahmen, nicht nur auf dem Bildschirm drucken. Ist das möglich? – Edamame

+0

Ok. Ich habe es funktioniert, indem Sie Ihren Filter in .agg verwenden ({"color_list": Lambda x: the_filter (Liste (x))}) Danke! Könnten Sie bitte ein wenig erläutern, was "x für (i, x) in enumerate (l [: - 1])" bedeutet? Vielen Dank! – Edamame

Verwandte Themen