2014-05-21 18 views
8

ho un df dataframe, con due colonne, voglio groupby una colonna e unire le liste appartiene allo stesso gruppo, esempio:panda GroupBy e unire elenchi

column_a, column_b 
1,   [1,2,3] 
1,   [2,5] 
2,   [5,6] 

dopo il processo:

column_a, column_b 
1,   [1,2,3,2,5] 
2,   [5,6] 

Voglio conservare tutti i duplicati. Ho le seguenti domande:

  • I dtypes del dataframe sono oggetto/i. convert_objects() non converte column_b in lista automaticamente. Come posso fare questo?
  • a cosa si applica la funzione in df.groupby (...). Apply (lambda x: ...)? qual è la forma di x? elenco?
  • la soluzione al mio problema principale?

Grazie in anticipo.

risposta

18

object dtype è un dtype catch-all che in pratica significa non int, float, bool, datetime o timedelta. Quindi li sta archiviando come una lista. convert_objects tenta di convertire una colonna in uno di questi tipi.

Volete

In [63]: df 
Out[63]: 
    a   b c 
0 1 [1, 2, 3] foo 
1 1  [2, 5] bar 
2 2  [5, 6] baz 


In [64]: df.groupby('a').agg({'b': 'sum', 'c': lambda x: ' '.join(x)}) 
Out[64]: 
     c    b 
a       
1 foo bar [1, 2, 3, 2, 5] 
2  baz   [5, 6] 

Questo gruppi il frame di dati in base ai valori della colonna a. Maggiori informazioni su [groupby]. (http://pandas.pydata.org/pandas-docs/stable/groupby.html).

Questo sta facendo una lista regolare sum (concatenamento), proprio come [1, 2, 3] + [2, 5]

+0

grazie, ho un'altra domanda: cosa succede se ho una terza colonna che è un tipo di stringa, e voglio "" .un loro per gruppo di colonna uno. Cosa dovrei fare? –

+0

Le stringhe sono come elenchi di caratteri. Quindi '.sum()' dovrebbe funzionare anche lì. – TomAugspurger

+0

Sì, ma voglio un '' (spazio bianco) tra ogni stringa concatenata. –

4
df.groupby('column_a').agg(sum) 

Questo funziona a causa di overloading degli operatori sum concatena le liste insieme. L'indice del df risultante sarà i valori da column_a:

Problemi correlati