Pandas JSON

JSON(JavaScript Object Notation, JavaScript Object Notation), est une syntaxe permettant de stocker et d'échanger des informations textuelles, similaire à XML.

JSON est plus petit, plus rapide et plus facile à analyser que XML. Pour plus de contenu JSON, reportez-vous àTutoriel JSON。

Pandas fournit des méthodes puissantes pour traiter les données au format JSON, prenant en charge la lecture de données à partir de fichiers ou de chaînes JSON et leur conversion en DataFrame, ainsi que la conversion d'un DataFrame au format JSON.

OpérationMéthodeDescription
Lire des données à partir d'un fichier/chaîne JSONpd.read_json()Lire et charger des données JSON en tant que DataFrame
Convertir DataFrame en JSONDataFrame.to_json()Convertir DataFrame en données au format JSON, vous pouvez spécifier la méthode de structuration
Formats de structuration JSON pris en chargeorientParamètrePrend en charge plusieurs formats de structuration, tels quesplit、records、columns

Pandas peut gérer les données JSON très facilement. Cet article utilisesites.jsoncomme exemple, avec le contenu suivant :

Exemple

[ { "id": "A001", "name": "Exemple", "url": "www.example.com", "likes": 61 }, { "id": "A002", "name": "Google", "url": "www.google.com", "likes": 124 }, { "id": "A003", "name": "Taobao", "url": "www.taobao.com", "likes": 45 } ]

Charger les données depuis un fichier/chaîne JSON

pd.read_json() - Lire les données JSON

read_json() est utilisé pour lire et charger des données au format JSON sous forme de DataFrame. Il prend en charge le chargement de données à partir de fichiers JSON, de chaînes JSON ou d'URL JSON.

Format de syntaxe:

import pandas as pd

df = pd.read_json(
    path_or_buffer,      # JSON 文件路径、JSON 字符串或 URL
    orient=None,         # JSON 数据的结构方式,默认是 'columns'
    dtype=None,          # 强制指定列的数据类型
    convert_axes=True,   # 是否转换行列索引
    convert_dates=True,  # 是否将日期解析为日期类型
    keep_default_na=True # 是否保留默认的缺失值标记
)

Description du paramètre :

ParamètreDescriptionValeur par défaut
path_or_bufferLe chemin d'accès au fichier JSON, une chaîne JSON ou une URLParamètre obligatoire
orientDéfinit la méthode de formatage des données JSON. Les valeurs courantes sontsplit、records、index、columns、values。None(déduit automatiquement à partir du fichier)
dtypeForcer la spécification du type de données des colonnesNone
convert_axesIndique s'il faut convertir les axes en types de données appropriésTrue
convert_datesIndique s'il faut analyser les dates comme des types de dateTrue
keep_default_naIndique s'il faut conserver les marqueurs de valeurs manquantes par défaut (tels queNaN)True

Options courantes du paramètre orient :

valeur orientExemple de format JSONDescription
split{"index":["a","b"],"columns":["A","B"],"data":[[1,2],[3,4]]}Utiliser les clésindex、columnsetdataStructure
records[{"A":1,"B":2},{"A":3,"B":4}]Chaque enregistrement est un dictionnaire représentant une ligne de données
index{"a":{"A":1,"B":2},"b":{"A":3,"B":4}}Utilise l'index comme clés, avec des valeurs sous forme de dictionnaires
columns{"A":{"a":1,"b":3},"B":{"a":2,"b":4}}Utilise les noms de colonnes comme clés, avec des dictionnaires comme valeurs
values[[1,2],[3,4]]Renvoie uniquement les données, en excluant l'index et les noms de colonnes

Charger les données à partir d'un fichier JSON :

Exemple

import pandas as pd

df = pd.read_json('sites.json')
   
print(df.to_string())

to_string()Utilisé pour renvoyer des données de type DataFrame. Nous pouvons également traiter directement des chaînes JSON.

Exemple

import pandas as pd

data =[
    {
      "id": "A001",
      "name": "Example",
      "url": "www.example.com",
      "likes": 61
    },
    {
      "id": "A002",
      "name": "Google",
      "url": "www.google.com",
      "likes": 124
    },
    {
      "id": "A003",
      "name": "Taobao",
      "url": "www.taobao.com",
      "likes": 45
    }
]
df = pd.DataFrame(data)

print(df)

La sortie de l'exemple ci-dessus est :

     id    name             url  likes
0  A001    Example  www.example.com     61
1  A002  Google  www.google.com    124
2  A003      淘宝  www.taobao.com     45

Les objets JSON ont le même format que les dictionnaires Python, nous pouvons donc directement convertir un dictionnaire Python en données DataFrame :

Exemple

import pandas as pd


# JSON au format dictionnaire
s = {
    "col1":{"row1":1,"row2":2,"row3":3},
    "col2":{"row1":"x","row2":"y","row3":"z"}
}

# Lire du JSON et convertir en DataFrame
df = pd.DataFrame(s)
print(df)

La sortie de l'exemple ci-dessus est :

      col1 col2
row1     1    x
row2     2    y
row3     3    z

Lire les données JSON à partir d'une URL :

Exemple

import pandas as pd

URL = '/static.jyshare.com/download/sites.json?v=2'
df = pd.read_json(URL)
print(df)

La sortie de l'exemple ci-dessus est :

     id    name             url  likes
0  A001    Example  www.example.com     61
1  A002  Google  www.google.com    124
2  A003      淘宝  www.taobao.com     45

Charger les données à partir d'une chaîne JSON :

Exemple

import pandas as pd

# Chaîne JSON
json_data = '''
[
  {"Name": "Alice", "Age": 25, "City": "New York"},
  {"Name": "Bob", "Age": 30, "City": "Los Angeles"},
  {"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''


# Lire les données depuis une chaîne JSON
df = pd.read_json(json_data)

print(df)

Sortie :

      Name  Age           City
0    Alice   25       New York
1      Bob   30    Los Angeles
2  Charlie   35        Chicago

Lire à partir de données JSON (spécifier orient comme 'records'):

Exemple

import pandas as pd

# Données JSON
json_data = '''
[
  {"Name": "Alice", "Age": 25, "City": "New York"},
  {"Name": "Bob", "Age": 30, "City": "Los Angeles"},
  {"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''


# Lire des données à partir d'une chaîne JSON, spécifier orient='records'
df = pd.read_json(json_data, orient='records')

print(df)

Sortie :

      Name  Age           City
0    Alice   25       New York
1      Bob   30    Los Angeles
2  Charlie   35        Chicago

Données JSON imbriquées

Supposons qu'il existe un ensemble de fichiers de données JSON imbriquésnested_list.json :

Contenu du fichier nested_list.json

{
    "school_name": "École primaire ABC",
    "class": "Année 1",
    "students": [
    {
        "id": "A001",
        "name": "Tom",
        "math": 60,
        "physique": 66,
        "chimie": 61
    },
    {
        "id": "A002",
        "name": "James",
        "math": 89,
        "physique": 76,
        "chimie": 51
    },
    {
        "id": "A003",
        "name": "Jenny",
        "math": 79,
        "physique": 90,
        "chimie": 78
    }]
}

Utilisez le code suivant pour formater le contenu complet :

Exemple

import pandas as pd

df = pd.read_json('nested_list.json')

print(df)

La sortie de l'exemple ci-dessus est :

          school_name   class                                           students
0  ABC primary school  Year 1  {'id': 'A001', 'name': 'Tom', 'math': 60, 'phy...
1  ABC primary school  Year 1  {'id': 'A002', 'name': 'James', 'math': 89, 'p...
2  ABC primary school  Year 1  {'id': 'A003', 'name': 'Jenny', 'math': 79, 'p...

À ce stade, nous devons utiliser la méthodejson_normalize()pour analyser complètement les données imbriquées :

Exemple

import pandas as pd
import json

# Charger les données à l'aide du module JSON de Python
with open('nested_list.json','r') as f:
    data = json.loads(f.read())

# Aplatir les données
df_nested_list = pd.json_normalize(data, record_path =['students'])
print(df_nested_list)

La sortie de l'exemple ci-dessus est :

     id   name  math  physics  chemistry
0  A001    Tom    60       66         61
1  A002  James    89       76         51
2  A003  Jenny    79       90         78

data = json.loads(f.read())Utilisez le module JSON de Python pour charger les données.

json_normalize()A utilisé le paramètrerecord_pathet l'a défini sur['students']pour aplatir les données JSON imbriquéesstudents。

Le résultat affiché n'inclut pas les éléments school_name et class. Si vous devez les afficher, vous pouvez utiliser le paramètre meta pour afficher ces métadonnées :

Exemple

import pandas as pd
import json

# Charger les données à l'aide du module JSON de Python
with open('nested_list.json','r') as f:
    data = json.loads(f.read())

# Aplatir les données
df_nested_list = pd.json_normalize(
    data,
    record_path =['students'],
    meta=['school_name', 'class']
)
print(df_nested_list)

La sortie de l'exemple ci-dessus est :

     id   name  math  physics  chemistry         school_name   class
0  A001    Tom    60       66         61  ABC primary school  Year 1
1  A002  James    89       76         51  ABC primary school  Year 1
2  A003  Jenny    79       90         78  ABC primary school  Year 1

Ensuite, essayons de lire des données JSON plus complexes qui imbriquent des listes et des dictionnaires. Le fichier de donnéesnested_mix.jsonest le suivant :

Contenu du fichier nested_mix.json

{
    "school_name": "école primaire locale",
    "class": "Année 1",
    "info": {
      "president": "John Kasich",
      "address": "ABC road, London, UK",
      "contacts": {
        "email": "[email protected]",
        "tel": "123456789"
      }
    },
    "students": [
    {
        "id": "A001",
        "name": "Tom",
        "math": 60,
        "physique": 66,
        "chimie": 61
    },
    {
        "id": "A002",
        "name": "James",
        "math": 89,
        "physique": 76,
        "chimie": 51
    },
    {
        "id": "A003",
        "name": "Jenny",
        "math": 79,
        "physique": 90,
        "chimie": 78
    }]
}

Convertir le fichier nested_mix.json en DataFrame:

Exemple

import pandas as pd
import json

# Charger les données à l'aide du module JSON de Python
with open('nested_mix.json','r') as f:
    data = json.loads(f.read())
   
df = pd.json_normalize(
    data,
    record_path =['students'],
    meta=[
        'class',
        ['info', 'president'],
        ['info', 'contacts', 'tel']
    ]
)

print(df)

La sortie de l'exemple ci-dessus est :

     id   name  math  physics  chemistry   class info.president info.contacts.tel
0  A001    Tom    60       66         61  Year 1    John Kasich         123456789
1  A002  James    89       76         51  Year 1    John Kasich         123456789
2  A003  Jenny    79       90         78  Year 1    John Kasich         123456789

Lire un ensemble de données à partir de données imbriquées

Voici le fichier d'exemplenested_deep.json, nous ne lisons que le champmathdes données imbriquées

Contenu du fichier nested_deep.json

{
    "school_name": "école primaire locale",
    "class": "Année 1",
    "students": [
    {
        "id": "A001",
        "name": "Tom",
        "grade": {
            "math": 60,
            "physique": 66,
            "chimie": 61
        }
 
    },
    {
        "id": "A002",
        "name": "James",
        "grade": {
            "math": 89,
            "physique": 76,
            "chimie": 51
        }
       
    },
    {
        "id": "A003",
        "name": "Jenny",
        "grade": {
            "math": 79,
            "physique": 90,
            "chimie": 78
        }
    }]
}

Ici, nous devons utiliser le moduleglompour gérer l'imbrication des données,glomLe module nous permet d'utiliser.pour accéder aux propriétés des objets imbriqués.

Avant de l'utiliser pour la première fois, nous devons installer glom :

pip3 install glom

Exemple

import pandas as pd
from glom import glom

df = pd.read_json('nested_deep.json')

data = df['students'].apply(lambda row: glom(row, 'grade.math'))
print(data)

La sortie de l'exemple ci-dessus est :

0    60
1    89
2    79
Name: students, dtype: int64

Convertir DataFrame en JSON

DataFrame.to_json() - Convertir un DataFrame en données JSON

La méthode to_json() est utilisée pour convertir un DataFrame en données au format JSON, et vous pouvez spécifier la méthode de structuration du JSON.

Format de syntaxe:

df.to_json(
    path_or_buffer=None,    # 输出的文件路径或文件对象,如果是 None 则返回 JSON 字符串
    orient=None,            # JSON 格式方式,支持 'split', 'records', 'index', 'columns', 'values'
    date_format=None,       # 日期格式,支持 'epoch', 'iso'
    default_handler=None,   # 自定义非标准类型的处理函数
    lines=False,            # 是否将每行数据作为一行(适用于 'records' ou  'split')
    encoding='utf-8'        # 编码格式
)

Description du paramètre :

ParamètreDescriptionValeur par défaut
path_or_bufferLe chemin du fichier de sortie ou l'objet fichier ; s'il estNone, puis renvoie une chaîne JSONNone
orientSpécifie la structure du format JSON ; prend en chargesplit、records、index、columns、valuesNone(la valeur par défaut estcolumns)
date_formatformat de date, prend en charge'epoch'ou'iso'formatNone
default_handlerGestion personnalisée des types non standard (tels quedatetimeetc.) fonction de traitementNone
linesIndique si chaque ligne de données doit être produite sur une seule ligne (applicable àrecordsousplit)False
encodingFormat d'encodage du fichier de sortie'utf-8'

Exemple

import pandas as pd

# Créer un DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
})

# Convertir un DataFrame en chaîne JSON
json_str = df.to_json()

print(json_str)

Convertir un DataFrame en fichier JSON (spécifier orient='records'):

Exemple

import pandas as pd

# Créer un DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Age': [25, 30, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
})

# Convertir le DataFrame en fichier JSON, spécifier orient='records'
df.to_json('data.json', orient='records', lines=True)

# Afficher le contenu du fichier généré :
# [
# {"Name":"Alice","Age":25,"City":"New York"},
# {"Name":"Bob","Age":30,"City":"Los Angeles"},
# {"Name":"Charlie","Age":35,"City":"Chicago"}
# ]

Convertir le DataFrame en JSON et spécifier le format de date :

Exemple

import pandas as pd

# Créer un DataFrame contenant des données de date
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Date': pd.to_datetime(['2021-01-01', '2022-02-01', '2023-03-01']),
    'Age': [25, 30, 35]
})

# Convertir le DataFrame en JSON, et spécifier le format de date comme 'iso'
json_str = df.to_json(date_format='iso')

print(json_str)
<p>
Sortie :
{"Name":{"0":"Alice","1":"Bob","2":"Charlie"},"Date":{"0":"2021-01-01T00:00:00.000Z","1":"2022-02-01T00:00:00.000Z","2":"2023-03-01T00:00:00.000Z"},"Age":{"0":25,"1":30,"2":35}}
Autres extensions