J'ai une liste de dictionnaires comme celui-ci:
[{'points': 50, 'time': '5:00', 'year': 2010},
{'points': 25, 'time': '6:00', 'month': "february"},
{'points':90, 'time': '9:00', 'month': 'january'},
{'points_h1':20, 'month': 'june'}]
Et je veux transformer cela en pandas DataFrame
comme celui-ci:
month points points_h1 time year
0 NaN 50 NaN 5:00 2010
1 february 25 NaN 6:00 NaN
2 january 90 NaN 9:00 NaN
3 june NaN 20 NaN NaN
Remarque: L'ordre des colonnes n'a pas d'importance.
Comment puis-je transformer la liste des dictionnaires en un DataFrame pandas comme indiqué ci-dessus?
python
dictionary
pandas
dataframe
appleLover
la source
la source
df = df.set_index('time')
aprèspandas.DataFrame
'{"":{"...
vous utilisez l'approche json_normalize, voir la réponse détaillée de @ cs95Les autres réponses sont correctes, mais peu a été expliqué en termes d'avantages et de limites de ces méthodes. Le but de cet article sera de montrer des exemples de ces méthodes dans différentes situations, de discuter quand utiliser (et quand ne pas utiliser) et suggérer des alternatives.
DataFrame()
,,DataFrame.from_records()
et.from_dict()
Selon la structure et le format de vos données, il existe des situations où les trois méthodes fonctionnent, ou certaines fonctionnent mieux que d'autres, ou certaines ne fonctionnent pas du tout.
Prenons un exemple très artificiel.
Cette liste comprend des "enregistrements" avec toutes les clés présentes. C'est le cas le plus simple que vous puissiez rencontrer.
Mot sur les orientations du dictionnaire:
orient='index'
/'columns'
Avant de continuer, il est important de faire la distinction entre les différents types d'orientations de dictionnaire et de soutien aux pandas. Il existe deux types principaux: "colonnes" et "index".
orient='columns'
Les dictionnaires avec l'orientation "colonnes" verront leurs clés correspondre aux colonnes du DataFrame équivalent.
Par exemple,
data
ci-dessus est dans l'orientation "colonnes".Remarque: Si vous utilisez
pd.DataFrame.from_records
, l'orientation est supposée être des "colonnes" (vous ne pouvez pas spécifier le contraire) et les dictionnaires seront chargés en conséquence.orient='index'
Avec cet orient, les clés sont supposées correspondre aux valeurs d'index. Ce type de données est le mieux adapté
pd.DataFrame.from_dict
.Ce cas n'est pas pris en compte dans le PO, mais reste utile à connaître.
Définition d'un index personnalisé
Si vous avez besoin d'un index personnalisé sur le DataFrame résultant, vous pouvez le définir à l'aide de l'
index=...
argument.Ceci n'est pas pris en charge par
pd.DataFrame.from_dict
.Gérer les clés / colonnes manquantes
Toutes les méthodes fonctionnent immédiatement lors de la manipulation de dictionnaires avec des clés / valeurs de colonne manquantes. Par exemple,
Lecture d'un sous-ensemble de colonnes
"Et si je ne veux pas lire dans chaque colonne"? Vous pouvez facilement spécifier cela en utilisant le
columns=...
paramètre.Par exemple, à partir de l'exemple de dictionnaire
data2
ci-dessus, si vous souhaitez lire uniquement les colonnes "A", "D" et "F", vous pouvez le faire en passant une liste:Ceci n'est pas supporté par
pd.DataFrame.from_dict
avec les "colonnes" orient par défaut.Lecture d'un sous-ensemble de lignes
Non pris en charge par aucune de ces méthodes directement . Vous devrez itérer sur vos données et effectuer une suppression inverse sur place au fur et à mesure de votre itération. Par exemple, pour extraire uniquement les 0 ème et 2 ème lignes d'en
data2
haut, vous pouvez utiliser:La panacée:
json_normalize
pour les données imbriquéesUne alternative forte et robuste aux méthodes décrites ci-dessus est la
json_normalize
fonction qui fonctionne avec des listes de dictionnaires (enregistrements), et en plus peut également gérer des dictionnaires imbriqués.Encore une fois, gardez à l'esprit que les données transmises
json_normalize
doivent être au format liste de dictionnaires (enregistrements).Comme mentionné,
json_normalize
peut également gérer les dictionnaires imbriqués. Voici un exemple tiré de la documentation.Pour plus d'informations sur les arguments
meta
etrecord_path
, consultez la documentation.Résumer
Voici un tableau de toutes les méthodes décrites ci-dessus, ainsi que les caractéristiques / fonctionnalités prises en charge.
* Utilisez
orient='columns'
puis transposez pour obtenir le même effet queorient='index'
.la source
Dans les pandas 16.2, je devais faire
pd.DataFrame.from_records(d)
pour que cela fonctionne.la source
deque
0.17.1
avec la solution @joris0.18.1
, il faut utiliserfrom_records
si les dictionnaires n'ont pas tous les mêmes clés.Vous pouvez également utiliser
pd.DataFrame.from_dict(d)
comme:la source
dict
s, et non à partir d'un seuldict
comme vous l'avez supposé dans votre réponse.Je sais que quelques personnes rencontreront cela et ne trouveront rien ici qui aide. La façon la plus simple que j'ai trouvée de le faire est la suivante:
J'espère que cela aide quelqu'un!
la source
et appel simple:
la source
la source
Pour convertir une liste de dictionnaires en DataFrame pandas, vous pouvez utiliser "ajouter":
Nous avons un dictionnaire appelé
dic
et dic a 30 éléments de la liste (list1
,list2
, ...,list30
)total_df
)total_df
aveclist1
total_df
la source
DataFrame()
,DataFrame.from_records()
et.from_dict()
?