Pandas DataFrame vào danh sách từ điển


165

Tôi có DataFrame sau:

khách hàng item1 item2 item3
1 quả cà chua sữa táo
2 củ cam nước
3 quả xoài ép

mà tôi muốn dịch nó sang danh sách từ điển mỗi hàng

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
Chào mừng bạn đến với Stack Overflow! Tôi đã thụt lề mẫu mã của bạn bằng 4 khoảng trắng để nó hiển thị đúng - vui lòng xem trợ giúp chỉnh sửa để biết thêm thông tin về định dạng.
Byteroulette

Câu trả lời:


189

Biên tập

Như John Galt đã đề cập trong câu trả lời của mình , có lẽ bạn nên sử dụng df.to_dict('records'). Nó nhanh hơn chuyển vị bằng tay.

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

Câu trả lời gốc

Sử dụng df.T.to_dict().values(), như dưới đây:

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
Điều gì sẽ là giải pháp trong trường hợp một khung dữ liệu chứa cho mỗi Khách hàng nhiều hàng?
Aziz

2
Khi tôi sử dụng df.T.to_dict().values(), tôi cũng mất thứ tự sắp xếp
Hussain

Khi mở tệp csv vào danh sách các ký tự, tôi nhận được tốc độ gấp đôi vớiunicodecsv.DictReader
radtek

219

Sử dụng df.to_dict('records')- cung cấp đầu ra mà không phải chuyển đổi bên ngoài.

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
Làm cách nào để thay đổi nó để bao gồm giá trị chỉ mục vào mỗi mục trong danh sách kết quả?
Gabriel L. Oliveira

5
@ GabrielL.Oliveira bạn có thể làm df.reset_index (). To_dict ('records')
Wei Ma

Là thứ tự của các cột được bảo lưu trong mỗi trường hợp, tức là mục thứ n trong danh sách kết quả luôn luôn là cột thứ n?
Khóa giữa

@Cleb là i.e. is the nth entry in the resulting list always also the nth column?cột thứ n hay hàng thứ n?
Nauman Naeem

14

Như một phần mở rộng cho câu trả lời của John Galt -

Đối với DataFrame sau,

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

Nếu bạn muốn có một danh sách từ điển bao gồm các giá trị chỉ mục, bạn có thể làm một cái gì đó như,

df.to_dict('index')

Mà xuất ra một từ điển từ điển trong đó các khóa của từ điển cha là các giá trị chỉ mục. Trong trường hợp cụ thể này,

{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

Nếu bạn quan tâm đến việc chỉ chọn một cột thì nó sẽ hoạt động.

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

Dưới đây sẽ KHÔNG hoạt động và tạo ra TypeError: loại không được hỗ trợ :. Tôi tin rằng điều này là bởi vì nó đang cố gắng chuyển đổi một chuỗi thành một lệnh và không phải là Khung dữ liệu thành một lệnh.

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

Tôi có một yêu cầu là chỉ chọn một cột và chuyển đổi nó thành một danh sách các ký tự với tên cột là khóa và bị kẹt ở đây một chút vì vậy tôi muốn chia sẻ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.