2013-08-09 21 views
9

Ho un df panda dataframe:Replica group_concat per 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 | 
+------+--------- 

voglio trovare o scrivere una funzione per restituire un dataframe che sarei tornato in MySQL utilizzando la seguente:

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

per il seguente risultato:

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

posso pensare a modi brutto per farlo scorrendo sopra le righe e Addin g ad un dizionario, ma deve esserci un modo migliore.

risposta

18

procedere come segue:

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

per ottenere un Series di stringhe o

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

per ottenere un Series di list s di stringhe.

Ecco ciò che i risultati assomigliano:

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 

Si noti che, in generale, qualsiasi ulteriore operazioni su questi tipi di Series sarà lenta e sono generalmente scoraggiato. Se esiste un altro modo per aggregare senza inserire un valore all'interno di uno Series, è consigliabile prendere in considerazione l'utilizzo di tale approccio.

+1

Se ho bisogno di questo tipo di cose da caricare nuovamente a un dataframe (e, idealmente, essere in grado di specificare il nome della colonna della colonna raggruppata) come potrei farlo? – Chad

+0

Si potrebbe provare 'df.groupby ('team'). Apply (lambda x: list (x.user)). To_pickle ('pickle.pkl')'. –

+0

potresti aggiungere la nuova colonna? – user1532587

4

Una soluzione più generale, se si desidera utilizzare agg:

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