2015-04-23 26 views
54

Mam następujący DataFrame:Pandy DataFrame do listy słowników

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

który chcę przełożyć je do listy słowników w rzędzie

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

Witamy w przepełnieniu stosu! Wpisałem próbkę kodu o 4 spacje, aby było poprawnie renderowane - zapoznaj się z pomocą do edycji, aby uzyskać więcej informacji na temat formatowania. – ByteHamster

Odpowiedz

64

Korzystanie df.T.to_dict().values(), jak poniżej:

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

Jako John Galt wspomina w his answer, powinieneś raczej zamiast tego użyć df.to_dict('records'). Jest szybszy niż ręczna transpozycja.

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

Jakie byłoby rozwiązanie w przypadku ramki danych zawierającej dla każdego klienta wiele wierszy? – JohnnySparow

+1

Kiedy używam 'df.T.to_dict(). Values ​​()', tracę kolejność sortowania również – Hussain

+0

Podczas otwierania pliku csv do listy dyktatur, otrzymuję dwukrotną prędkość z 'unicodecsv.DictReader' – radtek

96

Użyj df.to_dict('records') - daje wynik bez konieczności transpozycji zewnętrznej.

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

Jak czy mogę go zmienić, aby uwzględnić wartość indeksu w każdym wpisie wynikowej listy? –

+1

@ GabrielL.Oliveira możesz zrobić df.reset_index(). To_dict ('records') –

+2

To powinna być zaakceptowana odpowiedź – raffamaiden

4

Jako rozszerzenie John Galt's odpowiedź -

Na poniższym DataFrame,

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

Jeśli chcesz uzyskać listę słowników, w tym wartości indeksu można zrobić coś takiego,

df.to_dict('index') 

Który wyprowadza słownik słowników, gdzie ke ys słownika nadrzędnego są wartościami indeksu. W tym szczególnym przypadku:

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