2013-08-09 12 views
9

mam df pandy DataFrame:Replikacja GROUP_CONCAT dla pandas.DataFrame

+------+---------+ 
| team | user | 
+------+---------+ 
| A | elmer | 
| A | daffy | 
| A | bugs | 
| B | dawg | 
| A | foghorn | 
| B | speedy | 
| A | goofy | 
| A | marvin | 
| B | pepe | 
| C | petunia | 
| C | porky | 
+------+--------- 

Chcę znaleźć lub napisać funkcję do zwracania DataFrame że chciałbym wrócić w MySQL przy użyciu następujących:

SELECT 
    team, 
    GROUP_CONCAT(user) 
FROM 
    df 
GROUP BY 
    team 

na następujący wynik:

+------+---------------------------------------+ 
| team | group_concat(user)     | 
+------+---------------------------------------+ 
| A | elmer,daffy,bugs,foghorn,goofy,marvin | 
| B | dawg,speedy,pepe      | 
| C | petunia,porky       | 
+------+---------------------------------------+ 

mogę myśleć o nieprzyjemnych sposobów, aby to zrobić iteracji po wierszach i addin g do słownika, ale musi być lepszy sposób.

Odpowiedz

18

Wykonaj następujące czynności:

df.groupby('team').apply(lambda x: ','.join(x.user)) 

dostać Series ciągów lub

df.groupby('team').apply(lambda x: list(x.user)) 

aby uzyskać Series o list s ciągów.

Oto jakie wyniki wyglądać następująco:

In [33]: df.groupby('team').apply(lambda x: ', '.join(x.user)) 
Out[33]: 
team 
a  elmer, daffy, bugs, foghorn, goofy, marvin 
b        dawg, speedy, pepe 
c         petunia, porky 
dtype: object 

In [34]: df.groupby('team').apply(lambda x: list(x.user)) 
Out[34]: 
team 
a  [elmer, daffy, bugs, foghorn, goofy, marvin] 
b        [dawg, speedy, pepe] 
c         [petunia, porky] 
dtype: object 

Zauważ, że w ogóle jakiekolwiek dalsze operacje na tych typach Series będzie powolny i są na ogół zniechęca. Jeśli istnieje inny sposób agregowania bez umieszczania list wewnątrz Series, powinieneś rozważyć użycie tego podejścia.

+1

Jeśli muszę tego typu rzeczy, które mają być ładowane z powrotem w do dataframe (i, najlepiej, by móc określić nazwę kolumny pogrupowana kolumna) jak miałbym to zrobić? – Chad

+0

Możesz spróbować 'df.groupby ('team'). Apply (lambda x: list (x.user)). To_pickle ('pickle.pkl')'. –

+0

Czy możesz dodać nową kolumnę? – user1532587

4

Bardziej ogólne rozwiązanie, jeśli chcesz korzystać agg:

df.groupby('team').agg({'user' : lambda x: ', '.join(x)})