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 โ๐ฌโ๐จโ๐งโ_๐งโ๐จโ๐ซโ๐ฆโ๐โ๐ฅโ๐ขโ๐ณโ๐โ() .
- Nouveautรฉs de la version 1.0.0 (29 janvier 2020) – Obsolescences โ documentation pandas 1.0.0
- Dรฉplacer json_normalize vers l’espace de noms pd ยท Problรจme nยฐ 27586 ยท pandas-dev/pandas
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
