Pandas DataFrame ke Daftar Kamus

166

Saya memiliki DataFrame berikut:

pelanggan item1 item2 item3
1 tomat susu apel
2 kentang air jeruk
3 keripik mangga jus

yang ingin saya terjemahkan ke daftar kamus per baris

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'}]
Mohamad Ibrahim
sumber
2
Selamat Datang di Stack Overflow! Saya membuat indentasi sampel kode Anda sebanyak 4 spasi sehingga dapat ditampilkan dengan benar - silakan lihat bantuan pengeditan untuk informasi lebih lanjut tentang pemformatan.
ByteHamster

Jawaban:

189

Edit

Seperti yang disebutkan oleh John Galt dalam jawabannya , Anda sebaiknya menggunakan df.to_dict('records'). Ini lebih cepat daripada melakukan transpos secara manual.

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

Jawaban asli

Gunakan df.T.to_dict().values(), seperti di bawah ini:

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'}]
ComputerFellow
sumber
2
Apa yang akan menjadi solusi dalam hal kerangka data berisi banyak baris untuk setiap Pelanggan?
Aziz
2
Ketika saya menggunakan df.T.to_dict().values(), saya kehilangan urutan juga
Hussain
Saat membuka file csv ke daftar dicts, saya mendapatkan kecepatan dua kali lipat denganunicodecsv.DictReader
radtek
220

Gunakan df.to_dict('records')- memberikan output tanpa harus transpos secara eksternal.

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'}]
Nol
sumber
2
Bagaimana saya mengubahnya untuk memasukkan nilai indeks ke dalam setiap entri dari daftar yang dihasilkan?
Gabriel L. Oliveira
5
@ GabrielL.Oliveira Anda dapat melakukan df.reset_index (). To_dict ('records')
Wei Ma
Apakah urutan kolom dicadangkan dalam setiap kasus yaitu apakah entri ke-n dalam daftar yang dihasilkan selalu juga merupakan kolom ke-n?
Cleb
@ Cleb adalah i.e. is the nth entry in the resulting list always also the nth column?kolom ke - n atau baris ke-n?
Nauman Naeem
14

Sebagai perpanjangan dari jawaban John Galt -

Untuk DataFrame berikut,

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

Jika Anda ingin mendapatkan daftar kamus termasuk nilai indeks, Anda dapat melakukan sesuatu seperti,

df.to_dict('index')

Yang menghasilkan kamus kamus di mana kunci dari kamus induk adalah nilai indeks. Dalam kasus khusus ini,

{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'}}
Hossain Muctadir
sumber
1

Jika Anda tertarik hanya memilih satu kolom, ini akan berfungsi.

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

Di bawah ini TIDAK akan berfungsi dan menghasilkan TypeError: tipe tidak didukung:. Saya percaya ini karena sedang mencoba untuk mengubah seri menjadi dict dan bukan Frame Data ke dict.

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

Saya memiliki persyaratan untuk hanya memilih satu kolom dan mengonversinya ke daftar dicts dengan nama kolom sebagai kunci dan terjebak pada ini untuk sedikit jadi saya pikir saya akan berbagi.

Joe Rivera
sumber