Skip to content

Vous pouvez convertir une liste de dictionnaires avec des clรฉs partagรฉes en ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ avec ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ_๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฅโ€Œ๐ขโ€Œ๐ณโ€Œ๐žโ€Œ() .

Ce format est utilisรฉ dans le JSON obtenu ร  partir de l’API Web, donc le convertir en ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ est trรจs utile.

Cet article dรฉcrit le contenu suivant.

  • Conversion avec ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ()
  • Utilisation de base de ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ _๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฅโ€Œ๐ขโ€Œ๐ณโ€Œ๐žโ€Œ()
  • Traitement des cas complexes : : ๐ซโ€Œ๐žโ€Œ๐œโ€Œ๐จโ€Œ๐ซโ€Œ๐โ€Œ_๐ฉโ€Œ๐šโ€Œ๐ญโ€Œ๐กโ€Œ , ๐ฆโ€Œ๐žโ€Œ๐ญโ€Œ๐šโ€Œ
  • Lecture d’une partie de chaรฎnes ou de fichiers JSON

Utilisez ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ซโ€Œ๐žโ€Œ๐šโ€Œ๐โ€Œ_๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ() pour lire directement des chaรฎnes ou des fichiers JSON comme ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ au lieu d’un objet constituรฉ d’un dictionnaire ou d’une liste.

Notez que ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ _๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฅโ€Œ๐ขโ€Œ๐ณโ€Œ๐žโ€Œ() est disponible depuis pandas 1.0.0 . Dans les versions prรฉcรฉdentes, il รฉtait fourni sous la forme โ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ_๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฅโ€Œ๐ขโ€Œ๐ณโ€Œ๐žโ€Œ() .

Conversion avec ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ()

Utilisez la liste des dictionnaires suivants comme exemple.

import pandas as pd l_simple = [{'name': 'Alice', 'age': 25}, {'name': 'Bob'}] 

Une liste aussi simple de dictionnaires peut รชtre convertie avec ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ() .

La clรฉ du dictionnaire est traitรฉe comme l’รฉtiquette de la colonne et l’รฉlรฉment lorsque la clรฉ n’existe pas est traitรฉe comme la valeur manquante N๐šโ€ŒN .

print(pd.DataFrame(l_simple)) # name age # 0 Alice 25.0 # 1 Bob NaN 

๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ _๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฅโ€Œ๐ขโ€Œ๐ณโ€Œ๐žโ€Œ() renvoie le mรชme rรฉsultat.

print(pd.json_normalize(l_simple)) # name age # 0 Alice 25.0 # 1 Bob NaN 

Utilisation de base de ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ _๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฅโ€Œ๐ขโ€Œ๐ณโ€Œ๐žโ€Œ()

Utilisez la liste suivante de dictionnaires imbriquรฉs comme exemple.

l_nested = [{'name': 'Alice', 'age': 25, 'id': {'x': 2, 'y': 8}}, {'name': 'Bob', 'id': {'x': 10, 'y': 4}}] 

๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ() convertit les dictionnaires imbriquรฉs directement en รฉlรฉments.

print(pd.DataFrame(l_nested)) # name age id # 0 Alice 25.0 {'x': 2, 'y': 8} # 1 Bob NaN {'x': 10, 'y': 4} 

๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ _๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฅโ€Œ๐ขโ€Œ๐ณโ€Œ๐žโ€Œ() convertit les dictionnaires imbriquรฉs en colonnes sรฉparรฉes pour chaque clรฉ.

print(pd.json_normalize(l_nested)) # name age id.x id.y # 0 Alice 25.0 2 8 # 1 Bob NaN 10 4 

Par dรฉfaut, les parties imbriquรฉes ont des noms de colonnes au format <๐ฉโ€Œ๐šโ€Œ๐ซโ€Œ๐žโ€Œ๐งโ€Œ๐ญโ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ>.<๐œโ€Œ๐กโ€Œ๐ขโ€Œ๐ฅโ€Œ๐โ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ> . Ce sรฉparateur . peut รชtre modifiรฉ avec l’argument ๐ฌโ€Œ๐žโ€Œ๐ฉโ€Œ .

print(pd.json_normalize(l_nested, sep='_')) # name age id_x id_y # 0 Alice 25.0 2 8 # 1 Bob NaN 10 4 

Traitement des cas complexes : : ๐ซโ€Œ๐žโ€Œ๐œโ€Œ๐จโ€Œ๐ซโ€Œ๐โ€Œ_๐ฉโ€Œ๐šโ€Œ๐ญโ€Œ๐กโ€Œ , ๐ฆโ€Œ๐žโ€Œ๐ญโ€Œ๐šโ€Œ

Considรฉrez l’exemple suivant, oรน les valeurs du dictionnaire sont des listes de dictionnaires.

l_complex = [{'label': 'X', 'info' : {'n': 'nx', 'm': 'mx'}, 'data': [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}]}, {'label': 'Y', 'info' : {'n': 'ny', 'm': 'my'}, 'data': [{'a': 10, 'b': 20}, {'a': 30, 'b': 40}]}] 

Par dรฉfaut, la liste des dictionnaires est traitรฉe comme un รฉlรฉment.

print(pd.json_normalize(l_complex)) # label data info.n info.m # 0 X [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}] nx mx # 1 Y [{'a': 10, 'b': 20}, {'a': 30, 'b': 40}] ny my 

En spรฉcifiant une clรฉ avec l’argument ๐ซโ€Œ๐žโ€Œ๐œโ€Œ๐จโ€Œ๐ซโ€Œ๐โ€Œ_๐ฉโ€Œ๐šโ€Œ๐ญโ€Œ๐กโ€Œ , seules les valeurs correspondantes sont converties. Vous pouvez ajouter un prรฉfixe aux noms de colonnes avec l’argument ๐ซโ€Œ๐žโ€Œ๐œโ€Œ๐จโ€Œ๐ซโ€Œ๐โ€Œ_๐ฉโ€Œ๐ซโ€Œ๐žโ€Œ๐Ÿโ€Œ๐ขโ€Œ๐ฑโ€Œ .

print(pd.json_normalize(l_complex, record_path='data')) # a b # 0 1 2 # 1 3 4 # 2 10 20 # 3 30 40 print(pd.json_normalize(l_complex, record_path='data', record_prefix='data_')) # data_a data_b # 0 1 2 # 1 3 4 # 2 10 20 # 3 30 40 

Si vous souhaitez convertir les valeurs d’autres clรฉs, spรฉcifiez-les avec l’argument ๐ฆโ€Œ๐žโ€Œ๐ญโ€Œ๐šโ€Œ . Vous pouvez ajouter un prรฉfixe aux noms de colonnes avec l’argument ๐ฆโ€Œ๐žโ€Œ๐ญโ€Œ๐šโ€Œ_๐ฉโ€Œ๐ซโ€Œ๐žโ€Œ๐Ÿโ€Œ๐ขโ€Œ๐ฑโ€Œ .

print(pd.json_normalize(l_complex, record_path='data', meta='label')) # a b label # 0 1 2 X # 1 3 4 X # 2 10 20 Y # 3 30 40 Y print(pd.json_normalize(l_complex, record_path='data', meta='label', meta_prefix='meta_')) # a b meta_label # 0 1 2 X # 1 3 4 X # 2 10 20 Y # 3 30 40 Y 

Si la valeur de la clรฉ spรฉcifiรฉe dans ๐ฆโ€Œ๐žโ€Œ๐ญโ€Œ๐šโ€Œ est un dictionnaire, vous pouvez accรฉlรฉrer la clรฉ enfant ร  l’aide de la liste [[<๐ฉโ€Œ๐šโ€Œ๐ซโ€Œ๐žโ€Œ๐งโ€Œ๐ญโ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ>, <๐œโ€Œ๐กโ€Œ๐ขโ€Œ๐ฅโ€Œ๐โ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ>], …] . Par dรฉfaut, les noms de colonnes sont <๐ฉโ€Œ๐šโ€Œ๐ซโ€Œ๐žโ€Œ๐งโ€Œ๐ญโ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ>.<๐œโ€Œ๐กโ€Œ๐ขโ€Œ๐ฅโ€Œ๐โ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ> , mais vous pouvez modifier le sรฉparateur ร  l’aide de l’argument ๐ฌโ€Œ๐žโ€Œ๐ฉโ€Œ .

print(pd.json_normalize(l_complex, record_path='data', meta='info')) # a b info # 0 1 2 {'n': 'nx', 'm': 'mx'} # 1 3 4 {'n': 'nx', 'm': 'mx'} # 2 10 20 {'n': 'ny', 'm': 'my'} # 3 30 40 {'n': 'ny', 'm': 'my'} print(pd.json_normalize(l_complex, record_path='data', meta=[['info', 'n'], ['info', 'm']])) # a b info.n info.m # 0 1 2 nx mx # 1 3 4 nx mx # 2 10 20 ny my # 3 30 40 ny my print(pd.json_normalize(l_complex, record_path='data', meta=[['info', 'n'], ['info', 'm']], sep='_')) # a b info_n info_m # 0 1 2 nx mx # 1 3 4 nx mx # 2 10 20 ny my # 3 30 40 ny my 

Pour convertir tous les รฉlรฉments de cet exemple en ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ , configurez-le comme suit :

print(pd.json_normalize(l_complex, record_path='data', meta=['label', ['info', 'n'], ['info', 'm']], sep='_')) # a b label info_n info_m # 0 1 2 X nx mx # 1 3 4 X nx mx # 2 10 20 Y ny my # 3 30 40 Y ny my 

Assurez-vous d’utiliser une liste de listes, comme ๐ฆโ€Œ๐žโ€Œ๐ญโ€Œ๐šโ€Œ=[[<๐ฉโ€Œ๐šโ€Œ๐ซโ€Œ๐žโ€Œ๐งโ€Œ๐ญโ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ>, <๐œโ€Œ๐กโ€Œ๐ขโ€Œ๐ฅโ€Œ๐โ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ>]] , mรชme lorsque vous spรฉcifiez une seule clรฉ enfant. Une erreur se produit si ๐ฆโ€Œ๐žโ€Œ๐ญโ€Œ๐šโ€Œ=[<๐ฉโ€Œ๐šโ€Œ๐ซโ€Œ๐žโ€Œ๐งโ€Œ๐ญโ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ>, <๐œโ€Œ๐กโ€Œ๐ขโ€Œ๐ฅโ€Œ๐โ€Œ ๐คโ€Œ๐žโ€Œ๐ฒโ€Œ>] .

print(pd.json_normalize(l_complex, record_path='data', meta=[['info', 'n']])) # a b info.n # 0 1 2 nx # 1 3 4 nx # 2 10 20 ny # 3 30 40 ny # print(pd.json_normalize(l_complex, record_path='data', # meta=['info', 'n'])) # KeyError: "Try running with errors='ignore' as key 'n' is not always present" 

Lecture d’une partie de chaรฎnes ou de fichiers JSON

Comme mentionnรฉ ci-dessus, la liste des dictionnaires est un format courant dans JSON obtenu ร  partir de l’API Web. Cependant, il est rarement possible d’obtenir directement des donnรฉes dans ce format et vous devez souvent extraire une partie de la chaรฎne ou du fichier JSON.

Utilisez la chaรฎne au format JSON suivante comme exemple :

import pandas as pd import json s = '{"OTHER": "x", "DATA": [{"name":"Alice","age":25},{"name":"Bob","age":42}]}' 

๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ซโ€Œ๐žโ€Œ๐šโ€Œ๐โ€Œ_๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ() est une fonction permettant de convertir des chaรฎnes ou des fichiers JSON en , mais si les dictionnaires sont imbriquรฉs, les dictionnaires sont traitรฉs comme des รฉlรฉments.

print(pd.read_json(s)) # OTHER DATA # 0 x {'name': 'Alice', 'age': 25} # 1 x {'name': 'Bob', 'age': 42} 

Pour utiliser ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ _๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฅโ€Œ๐ขโ€Œ๐ณโ€Œ๐žโ€Œ() , convertissez d’abord la chaรฎne JSON en objets constituรฉs de dictionnaires et de listes avec ๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ.๐ฅโ€Œ๐จโ€Œ๐šโ€Œ๐โ€Œ๐ฌโ€Œ() dans le Module ๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ de la bibliothรจque standard. Utilisez ๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ.๐ฅโ€Œ๐จโ€Œ๐šโ€Œ๐โ€Œ() pour lire un fichier JSON.

d = json.loads(s) print(d) # {'OTHER': 'x', 'DATA': [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 42}]} print(type(d)) # <class 'dict'> 

En dรฉfinissant correctement les arguments ๐ซโ€Œ๐žโ€Œ๐œโ€Œ๐จโ€Œ๐ซโ€Œ๐โ€Œ_๐ฉโ€Œ๐šโ€Œ๐ญโ€Œ๐กโ€Œ et ๐ฆโ€Œ๐žโ€Œ๐ญโ€Œ๐šโ€Œ , vous pouvez convertir la chaรฎne JSON en ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ avec ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.๐ฃโ€Œ๐ฌโ€Œ๐จโ€Œ๐งโ€Œ_๐งโ€Œ๐จโ€Œ๐ซโ€Œ๐ฆโ€Œ๐šโ€Œ๐ฅโ€Œ๐ขโ€Œ๐ณโ€Œ๐žโ€Œ() .

print(pd.json_normalize(d)) # OTHER DATA # 0 x [{'name': 'Alice', 'age': 25}, {'name': 'Bob',... print(pd.json_normalize(d, record_path='DATA')) # name age # 0 Alice 25 # 1 Bob 42 print(pd.json_normalize(d, record_path='DATA', meta='OTHER')) # name age OTHER # 0 Alice 25 x # 1 Bob 42 x 

Si vous souhaitez uniquement convertir une partie de la chaรฎne JSON en ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ , vous pouvez extraire la partie souhaitรฉe de l’objet. Pour les structures profondรฉment imbriquรฉes, rรฉpรฉtez les noms de clรฉs comme [๐คโ€Œ๐žโ€Œ๐ฒโ€Œ ๐งโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ] ๐งโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ] .

Comme mentionnรฉ ci-dessus, une liste de dictionnaires non imbriquรฉs peut รฉgalement รชtre convertie avec ๐ฉโ€Œ๐šโ€Œ๐งโ€Œ๐โ€Œ๐šโ€Œ๐ฌโ€Œ.D๐šโ€Œ๐ญโ€Œ๐šโ€ŒF๐ซโ€Œ๐šโ€Œ๐ฆโ€Œ๐žโ€Œ() .

print(d['DATA']) # [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 42}] print(type(d['DATA'])) # <class 'list'> print(pd.DataFrame(d['DATA'])) # name age # 0 Alice 25 # 1 Bob 42 print(pd.json_normalize(d['DATA'])) # name age # 0 Alice 25 # 1 Bob 42