Pandas DataFrame all'elenco dei dizionari


166

Ho il seguente DataFrame:

articolo cliente1 articolo2 articolo3
1 pomodoro latte di mele
2 patate all'arancia
3 chip di mango al succo

che voglio tradurlo in un elenco di 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'}]

2
Benvenuto in Stack Overflow! Ho indentato il tuo esempio di codice di 4 spazi in modo che venga visualizzato correttamente. Per ulteriori informazioni sulla formattazione, consulta la guida alla modifica.
ByteHamster,

Risposte:


189

modificare

Come menziona John Galt nella sua risposta , probabilmente dovresti invece usare 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

Risposta originale

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'}]

2
Quale sarebbe la soluzione nel caso di un frame di dati contenente per ogni cliente più righe?
Aziz,

2
Quando uso df.T.to_dict().values(),
Hussain,

Quando apro un file CSV per un elenco di dadi, ottengo il doppio della velocità conunicodecsv.DictReader
radtek

220

Usa df.to_dict('records'): fornisce l'output senza doverlo 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'}]

2
Come lo cambierei per includere il valore dell'indice in ciascuna voce dell'elenco risultante?
Gabriel L. Oliveira,

5
@ GabrielL.Oliveira puoi fare df.reset_index (). To_dict ('records')
Wei Ma

L'ordine delle colonne è riservato in ciascun caso, ovvero l'ennesima voce nell'elenco risultante è sempre anche l'ennesima colonna?
Cleb,

@Cleb sono l' i.e. is the nth entry in the resulting list always also the nth column?ennesima colonna o l'ennesima riga?
Nauman Naeem,

14

Come estensione alla risposta di John Galt -

Per il seguente DataFrame,

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

Se desideri ottenere un elenco di dizionari inclusi i valori dell'indice, puoi fare qualcosa del genere,

df.to_dict('index')

Che genera un dizionario di dizionari in cui le chiavi del dizionario principale sono valori di indice. In questo caso particolare,

{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'}}

1

Se sei interessato a selezionare solo una colonna, funzionerà.

df[["item1"]].to_dict("records")

Quanto segue NON funziona e produce un TypeError: tipo non supportato:. Credo che questo sia perché sta cercando di convertire una serie in un dict e non un Data Frame in un dict.

df["item1"].to_dict("records")

Avevo l'obbligo di selezionare solo una colonna e convertirla in un elenco di dicts con il nome della colonna come chiave e sono rimasto bloccato su questo per un po 'così ho pensato di condividere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.