2015-04-23 13 views
54

Ho la seguente dataframe:Pandas dataframe la lista di dizionari

 
customer item1  item2 item3 
1   apple  milk  tomato 
2   water  orange potato 
3   juice  mango chips 

che voglio tradurlo alla lista dei dizionari per riga

rows = [{'customer': 1, 'item1': 'apple', 'item2': 'milk', 'item3': 'tomato'}, 
    {'customer': 2, 'item1': 'water', 'item2': 'orange', 'item3': 'potato'}, 
    {'customer': 3, 'item1': 'juice', 'item2': 'mango', 'item3': 'chips'}] 
+1

Benvenuti in Stack Overflow! Ho indentato il codice di esempio di 4 spazi in modo che il rendering sia corretto: per ulteriori informazioni sulla formattazione, consultare la guida alla modifica. – ByteHamster

risposta

64

Usa df.T.to_dict().values(), come di seguito:

In [1]: df 
Out[1]: 
    customer item1 item2 item3 
0   1 apple milk tomato 
1   2 water orange potato 
2   3 juice mango chips 

In [2]: df.T.to_dict().values() 
Out[2]: 
[{'customer': 1.0, 'item1': 'apple', 'item2': 'milk', 'item3': 'tomato'}, 
{'customer': 2.0, 'item1': 'water', 'item2': 'orange', 'item3': 'potato'}, 
{'customer': 3.0, 'item1': 'juice', 'item2': 'mango', 'item3': 'chips'}] 

Come Giovanni Galt cita in his answer, probabilmente dovresti usare invece df.to_dict('records'). È più veloce della trasposizione manuale.

In [20]: timeit df.T.to_dict().values() 
1000 loops, best of 3: 395 µs per loop 

In [21]: timeit df.to_dict('records') 
10000 loops, best of 3: 53 µs per loop 
+1

Quale sarebbe la soluzione nel caso di un dataframe contenente per ogni cliente molte righe? – JohnnySparow

+1

Quando uso 'df.T.to_dict(). Valori()', perdo anche l'ordinamento – Hussain

+0

Quando apri un file csv in un elenco di dicts, ottengo il doppio della velocità con 'unicodecsv.DictReader' – radtek

96

Uso df.to_dict('records') - dà l'uscita senza dover trasporre esternamente.

In [2]: df.to_dict('records') 
Out[2]: 
[{'customer': 1L, 'item1': 'apple', 'item2': 'milk', 'item3': 'tomato'}, 
{'customer': 2L, 'item1': 'water', 'item2': 'orange', 'item3': 'potato'}, 
{'customer': 3L, 'item1': 'juice', 'item2': 'mango', 'item3': 'chips'}] 
+0

How dovrei cambiarlo per includere il valore dell'indice in ogni voce dell'elenco risultante? –

+1

@ GabrielL.Oliveira puoi fare df.reset_index(). To_dict ('records') –

+2

Questa dovrebbe essere la risposta accettata – raffamaiden

4

Come estensione di John Galt's risposta -

Per il seguente dataframe,

customer item1 item2 item3 
0   1 apple milk tomato 
1   2 water orange potato 
2   3 juice mango chips 

Se si desidera ottenere un elenco di dizionari compresi i valori di indice, si può fare qualcosa di simile,

df.to_dict('index') 

Quale uscita un dizionario di dizionari dove ke ys del dizionario principale sono valori di indice. In questo caso specifico,

{0: {'customer': 1, 'item1': 'apple', 'item2': 'milk', 'item3': 'tomato'}, 
1: {'customer': 2, 'item1': 'water', 'item2': 'orange', 'item3': 'potato'}, 
2: {'customer': 3, 'item1': 'juice', 'item2': 'mango', 'item3': 'chips'}}