Pandas DataFrame à la liste des dictionnaires


166

J'ai le DataFrame suivant:

article client1 article2 article3
1 tomate au lait de pomme
2 pommes de terre orange d'eau
3 chips de jus de mangue

dont je veux le traduire en liste de dictionnaires par ligne

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
Bienvenue dans Stack Overflow! J'ai mis en retrait votre échantillon de code de 4 espaces afin qu'il s'affiche correctement - veuillez consulter l'aide à l'édition pour plus d'informations sur le formatage.
ByteHamster

Réponses:


189

Éditer

Comme John Galt le mentionne dans sa réponse , vous devriez probablement utiliser à la place df.to_dict('records'). C'est plus rapide que la transposition manuelle.

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

Réponse originale

Utilisez df.T.to_dict().values(), comme ci-dessous:

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
Quelle serait la solution dans le cas d'un dataframe contenant pour chaque Client plusieurs lignes?
Aziz

2
Quand j'utilise df.T.to_dict().values(), je perds aussi l'ordre de tri
Hussain

Lors de l'ouverture d'un fichier csv à la liste des dictionnaires, j'obtiens deux fois la vitesse avecunicodecsv.DictReader
radtek

220

Utilisation df.to_dict('records')- donne la sortie sans avoir à transposer en externe.

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
Comment le changerais-je pour inclure la valeur d'index dans chaque entrée de la liste résultante?
Gabriel L. Oliveira

5
@ GabrielL.Oliveira vous pouvez faire df.reset_index (). To_dict ('records')
Wei Ma

L'ordre des colonnes est-il réservé dans chaque cas, c'est-à-dire que la nième entrée dans la liste résultante est-elle toujours aussi la nième colonne?
Cleb

@Cleb est la i.e. is the nth entry in the resulting list always also the nth column?nième colonne ou la nième ligne?
Nauman Naeem

14

En prolongement de la réponse de John Galt -

Pour le DataFrame suivant,

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

Si vous souhaitez obtenir une liste de dictionnaires comprenant les valeurs d'index, vous pouvez faire quelque chose comme,

df.to_dict('index')

Qui produit un dictionnaire de dictionnaires où les clés du dictionnaire parent sont des valeurs d'index. Dans ce cas particulier,

{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

Si vous souhaitez sélectionner une seule colonne, cela fonctionnera.

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

Ce qui suit ne fonctionnera PAS et produira une TypeError: unsupported type:. Je pense que c'est parce qu'il essaie de convertir une série en dict et non une trame de données en dict.

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

J'avais l'obligation de ne sélectionner qu'une colonne et de la convertir en une liste de dictionnaires avec le nom de la colonne comme clé et j'étais coincé là-dessus pendant un peu, donc je pensais que je partagerais.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.