Pandas DataFrame до списку словників


165

У мене є такі DataFrame:

замовник item1 item2 item3
1 яблучний молочний помідор
2 води апельсинової картоплі
3 стружки манго з соком

що я хочу перекласти це до списку словників у рядку

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
Ласкаво просимо до переповнення стека! Я зрізав зразок вашого коду на 4 пробіли, щоб він відображався належним чином - див. Довідку щодо редагування для отримання додаткової інформації щодо форматування.
ByteHamster

Відповіді:


189

Редагувати

Як згадує Джон Гальт у своїй відповіді , ви, ймовірно, замість цього повинні використовувати df.to_dict('records'). Це швидше, ніж транспортувати вручну.

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

Оригінальна відповідь

Використовуйте df.T.to_dict().values(), як нижче:

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
Що було б рішенням у випадку, коли кадр даних містить для кожного Замовника багато рядків?
Азіз

2
Під час використання df.T.to_dict().values()я також
втрачаю

Відкриваючи файл csv до списку диктів, я отримую вдвічі швидкість зunicodecsv.DictReader
radtek

220

Використання df.to_dict('records')- дає вихід без необхідності переміщувати зовні.

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
Як я міг би змінити його, щоб включити значення індексу до кожного запису результуючого списку?
Габріель Л. Олівейра

5
@ GabrielL.Oliveira ви можете зробити df.reset_index (). To_dict ('записи')
Wei Ma

Чи порядок стовпців зарезервований у кожному випадку, тобто чи n-й запис у результуючому списку завжди також є n-м стовпцем?
Клеб

@Cleb - i.e. is the nth entry in the resulting list always also the nth column?n-й стовпець чи n-й рядок?
Науман

14

Як продовження відповіді Джона Гальта -

Для наступних DataFrame,

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

Якщо ви хочете отримати список словників, включаючи значення індексу, ви можете зробити щось на зразок,

df.to_dict('index')

Який видає словник словників, де ключі батьківського словника є значеннями індексу. У цьому конкретному випадку

{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

Якщо вас цікавить лише один стовпець, це спрацює.

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

Нижче НЕ працює, і створює TypeError: непідтримуваний тип:. Я вважаю, це тому, що він намагається перетворити серію в дикт, а не кадр даних в дикт.

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

У мене була вимога вибрати лише один стовпчик і перетворити його на список диктовок із ім'ям стовпця як ключовим, і я затримався на цьому трохи, тому я зрозумів, що поділюсь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.