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ération | Méthode | Description |
|---|---|---|
| Lire des données à partir d'un fichier/chaîne JSON | pd.read_json() | Lire et charger des données JSON en tant que DataFrame |
| Convertir DataFrame en JSON | DataFrame.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 charge | orientParamètre | Prend 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
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ètre | Description | Valeur par défaut |
|---|---|---|
path_or_buffer | Le chemin d'accès au fichier JSON, une chaîne JSON ou une URL | Paramètre obligatoire |
orient | Dé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) |
dtype | Forcer la spécification du type de données des colonnes | None |
convert_axes | Indique s'il faut convertir les axes en types de données appropriés | True |
convert_dates | Indique s'il faut analyser les dates comme des types de date | True |
keep_default_na | Indique s'il faut conserver les marqueurs de valeurs manquantes par défaut (tels queNaN) | True |
Options courantes du paramètre orient :
| valeur orient | Exemple de format JSON | Description |
|---|---|---|
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
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
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
# 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
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
# 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
# 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
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 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 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 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
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ètre | Description | Valeur par défaut |
|---|---|---|
path_or_buffer | Le chemin du fichier de sortie ou l'objet fichier ; s'il estNone, puis renvoie une chaîne JSON | None |
orient | Spécifie la structure du format JSON ; prend en chargesplit、records、index、columns、values | None(la valeur par défaut estcolumns) |
date_format | format de date, prend en charge'epoch'ou'iso'format | None |
default_handler | Gestion personnalisée des types non standard (tels quedatetimeetc.) fonction de traitement | None |
lines | Indique si chaque ligne de données doit être produite sur une seule ligne (applicable àrecordsousplit) | False |
encoding | Format d'encodage du fichier de sortie | 'utf-8' |
Exemple
# 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
# 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
# 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>
{"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