Image par auteur | DALLE-3 & Canva
Si vous avez déjà eu la chance de travailler avec des données, vous avez probablement rencontré le besoin de charger des fichiers JSON (abréviation de JavaScript Object Notation) dans un Pandas DataFrame pour une analyse plus approfondie. Les fichiers JSON stockent les données dans un format clair à lire et simple à comprendre pour les ordinateurs. Cependant, les fichiers JSON peuvent parfois être compliqués à parcourir. Par conséquent, nous les chargeons dans un format plus structuré tel que DataFrames, configuré comme une feuille de calcul avec des lignes et des colonnes.
Je vais vous montrer deux manières différentes de convertir des données JSON en un Pandas DataFrame. Avant de discuter de ces méthodes, supposons ce fichier JSON imbriqué factice que j’utiliserai comme exemple tout au long de cet article.
{
"books": [
{
"title": "One Hundred Years of Solitude",
"author": "Gabriel Garcia Marquez",
"reviews": [
{
"reviewer": {
"name": "Kanwal Mehreen",
"location": "Islamabad, Pakistan"
},
"rating": 4.5,
"comments": "Magical and completely breathtaking!"
},
{
"reviewer": {
"name": "Isabella Martinez",
"location": "Bogotá, Colombia"
},
"rating": 4.7,
"comments": "A marvelous journey through a world of magic."
}
]
},
{
"title": "Things Fall Apart",
"author": "Chinua Achebe",
"reviews": [
{
"reviewer": {
"name": "Zara Khan",
"location": "Lagos, Nigeria"
},
"rating": 4.9,
"comments": "Things Fall Apart is the best of contemporary African literature."
}]}]}
Les données JSON mentionnées ci-dessus représentent une liste de livres, où chaque livre a un titre, un auteur et une liste de critiques. Chaque avis, à son tour, a un évaluateur (avec un nom et un emplacement), une note et des commentaires.
Méthode 1 : Utiliser le json.load()
et pd.DataFrame()
les fonctions
L’approche la plus simple et la plus directe consiste à utiliser l’outil intégré json.load()
fonction pour analyser nos données JSON. Cela le convertira en un dictionnaire Python, et nous pourrons ensuite créer le DataFrame directement à partir de la structure de données Python résultante. Cependant, il a un problème : il ne peut gérer que des données imbriquées uniques. Donc, pour le cas ci-dessus, si vous utilisez uniquement ces étapes avec ce code :
import json
import pandas as pd
#Load the JSON data
with open('books.json','r') as f:
data = json.load(f)
#Create a DataFrame from the JSON data
df = pd.DataFrame(data['books'])
df
Votre résultat pourrait ressembler à ceci :
Sortir:
Dans la colonne des critiques, vous pouvez voir l’intégralité du dictionnaire. Par conséquent, si vous souhaitez que la sortie apparaisse correctement, vous devez gérer manuellement la structure imbriquée. Cela peut être fait comme suit:
#Create a DataFrame from the nested JSON data
df = pd.DataFrame([
{
'title': book['title'],
'author': book['author'],
'reviewer_name': review['reviewer']['name'],
'reviewer_location': review['reviewer']['location'],
'rating': review['rating'],
'comments': review['comments']
}
for book in data['books']
for review in book['reviews']
])
Sortie mise à jour :
Ici, nous utilisons la compréhension de liste pour créer une liste plate de dictionnaires, où chaque dictionnaire contient les informations sur le livre et la critique correspondante. Nous créons ensuite le Pandas DataFrae en utilisant ceci.
Cependant, le problème de cette approche est qu’elle nécessite davantage d’efforts manuels pour gérer la structure imbriquée des données JSON. Et maintenant ? Avons-nous une autre option ?
Totalement! Je veux dire, allez. Étant donné que nous sommes au XXIe siècle, affronter un tel problème sans solution semble irréaliste. Voyons l’autre approche.
Méthode 2 (recommandée) : Utilisation du json_normalize()
fonction
Le json_normalize()
La fonction de la bibliothèque Pandas est un meilleur moyen de gérer les données JSON imbriquées. Il aplatit automatiquement la structure imbriquée des données JSON, créant un DataFrame à partir des données résultantes. Jetons un coup d’œil au code :
import pandas as pd
import json
#Load the JSON data
with open('books.json', 'r') as f:
data = json.load(f)
#Create the DataFrame using json_normalize()
df = pd.json_normalize(
data=data['books'],
meta=['title', 'author'],
record_path="reviews",
errors="raise"
)
df
Sortir:
Le json_normalize()
la fonction prend les paramètres suivants :
- données: Les données d’entrée, qui peuvent être une liste de dictionnaires ou un seul dictionnaire. Dans ce cas, il s’agit du dictionnaire de données chargé à partir du fichier JSON.
- chemin_enregistrement : Chemin d’accès dans les données JSON vers les enregistrements que vous souhaitez normaliser. Dans ce cas, il s’agit de la clé « avis ».
- méta : Champs supplémentaires à inclure dans la sortie normalisée du document JSON. Dans ce cas, nous utilisons les champs « titre » et « auteur ». Notez que les colonnes des métadonnées apparaissent généralement à la fin. Voici comment fonctionne cette fonction. En ce qui concerne l’analyse, cela n’a pas d’importance, mais pour une raison magique, vous souhaitez que ces colonnes apparaissent avant. Désolé, mais vous devez les faire manuellement.
- les erreurs: La stratégie de gestion des erreurs, qui peut être « ignorer », « augmenter » ou « avertir ». Nous l’avons défini sur « raise », donc s’il y a des erreurs pendant le processus de normalisation, une exception sera déclenchée.
Emballer
Ces deux méthodes ont leurs propres avantages et cas d’utilisation, et le choix de la méthode dépend de la structure et de la complexité des données JSON. Si les données JSON ont une structure très imbriquée, le json_normalize()
La fonction pourrait être l’option la plus appropriée, car elle peut gérer automatiquement les données imbriquées. Si les données JSON sont relativement simples et plates, le pd.read_json()
la fonction pourrait être l’approche la plus simple et la plus directe.
Lorsque vous traitez des fichiers JSON volumineux, il est crucial de penser à l’utilisation de la mémoire et aux performances, car le chargement de l’intégralité du fichier en mémoire peut ne pas fonctionner. Vous devrez donc peut-être envisager d’autres options telles que la diffusion en continu des données, le chargement paresseux ou l’utilisation d’un format plus économe en mémoire comme Parquet.
Kanwal Mehreen Kanwal est un ingénieur en apprentissage automatique et un rédacteur technique passionné par la science des données et l’intersection de l’IA et de la médecine. Elle a co-écrit l’ebook « Maximiser la productivité avec ChatGPT ». En tant que Google Generation Scholar 2022 pour l’APAC, elle défend la diversité et l’excellence académique. Elle est également reconnue comme boursière Teradata Diversity in Tech, boursière de recherche Mitacs Globalink et boursière Harvard WeCode. Kanwal est un ardent défenseur du changement, ayant fondé FEMCodes pour autonomiser les femmes dans les domaines STEM.