Pandas JSON
JSON(JavaScript Object NNotación de objetos JavaScript, es una sintaxis para almacenar e intercambiar información de texto, similar a XML.
JSON es más pequeño, más rápido y más fácil de analizar que XML. Para más contenido sobre JSON, consulteTutorial de JSON。
Pandas proporciona potentes métodos para manejar datos en formato JSON, admite leer datos desde archivos o cadenas JSON y convertirlos a DataFrame, así como convertir DataFrame de vuelta a formato JSON.
| Operación | Método | Descripción |
|---|---|---|
| Leer datos desde archivo/cadena JSON | pd.read_json() | Leer datos JSON y cargarlos como DataFrame |
| Convertir DataFrame a JSON | DataFrame.to_json() | Convierte DataFrame a datos en formato JSON, se puede especificar el método de estructuración |
| Métodos de estructuración JSON compatibles | orientParámetro | Admite múltiples métodos de estructuración, comosplit、records、columns |
Pandas puede manejar datos JSON convenientemente. Este artículo toma como ejemplosites.jsonpor ejemplo, el contenido es el siguiente:
Ejemplo
Cargar datos desde archivos/cadenas JSON
pd.read_json() - Leer datos JSON
read_json() se utiliza para leer datos en formato JSON y cargarlos como un DataFrame. Admite cargar datos desde archivos JSON, cadenas JSON o URLs JSON.
Formato de sintaxis:
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 # 是否保留默认的缺失值标记
)Descripción de parámetros:
| Parámetro | Descripción | Valor predeterminado |
|---|---|---|
path_or_buffer | Ruta del archivo JSON, cadena JSON o URL | Parámetro obligatorio |
orient | Define el método de formato de los datos JSON. Los valores comunes son:split、records、index、columns、values。 | None(inferido automáticamente del archivo) |
dtype | Forzar la especificación del tipo de dato de las columnas | None |
convert_axes | Si se convierten los ejes a tipos de datos apropiados | True |
convert_dates | Si se analizan las fechas como tipo fecha | True |
keep_default_na | Si se conservan los marcadores de valores faltantes predeterminados (comoNaN) | True |
Opciones comunes del parámetro orient:
| Valor de orient | Ejemplo de formato JSON | Descripción |
|---|---|---|
split | {"index":["a","b"],"columns":["A","B"],"data":[[1,2],[3,4]]} | Usar clavesindex、columnsydataEstructura |
records | [{"A":1,"B":2},{"A":3,"B":4}] | Cada registro es un diccionario, que representa una fila de datos |
index | {"a":{"A":1,"B":2},"b":{"A":3,"B":4}} | Usa el índice como clave y el valor como diccionario |
columns | {"A":{"a":1,"b":3},"B":{"a":2,"b":4}} | Usa los nombres de columnas como claves y los valores como diccionarios |
values | [[1,2],[3,4]] | Devuelve solo los datos, sin incluir el índice ni los nombres de columnas |
Cargar datos desde un archivo JSON:
Ejemplo
df = pd.read_json('sites.json')
print(df.to_string())
to_string()Se utiliza para devolver datos de tipo DataFrame; también podemos procesar directamente cadenas JSON.
Ejemplo
data =[
{
"id": "A001",
"name": "Tutorial para novatos",
"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)
El resultado del ejemplo anterior es:
id name url likes
0 A001 Ejemplo www.example.com 61
1 A002 Google www.google.com 124
2 A003 淘宝 www.taobao.com 45
Los objetos JSON tienen el mismo formato que los diccionarios de Python, por lo que podemos convertir directamente diccionarios de Python en datos DataFrame:
Ejemplo
# JSON en formato de diccionario
s = {
"col1":{"row1":1,"row2":2,"row3":3},
"col2":{"row1":"x","row2":"y","row3":"z"}
}
# Leer JSON y convertir a DataFrame
df = pd.DataFrame(s)
print(df)
El resultado del ejemplo anterior es:
col1 col2
row1 1 x
row2 2 y
row3 3 z
Leer datos JSON desde URL:
Ejemplo
URL = '/static.jyshare.com/download/sites.json?v=2'
df = pd.read_json(URL)
print(df)
El resultado del ejemplo anterior es:
id name url likes
0 A001 Ejemplo www.example.com 61
1 A002 Google www.google.com 124
2 A003 淘宝 www.taobao.com 45
Cargar datos desde una cadena JSON:
Ejemplo
# Cadena JSON
json_data = '''
[
{"Name": "Alice", "Age": 25, "City": "New York"},
{"Name": "Bob", "Age": 30, "City": "Los Angeles"},
{"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''
# Leer datos desde la cadena JSON
df = pd.read_json(json_data)
print(df)
Salida:
Name Age City
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
Leer desde datos JSON (especificar orient como records):
Ejemplo
# Datos JSON
json_data = '''
[
{"Name": "Alice", "Age": 25, "City": "New York"},
{"Name": "Bob", "Age": 30, "City": "Los Angeles"},
{"Name": "Charlie", "Age": 35, "City": "Chicago"}
]
'''
# Leer datos desde la cadena JSON, especificar orient='records'
df = pd.read_json(json_data, orient='records')
print(df)
Salida:
Name Age City
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
Datos JSON anidados
Supongamos que hay un conjunto de archivos de datos JSON anidadosnested_list.json :Contenido del archivo nested_list.json
"school_name": "ABC primary school",
"class": "Year 1",
"students": [
{
"id": "A001",
"name": "Tom",
"math": 60,
"physics": 66,
"chemistry": 61
},
{
"id": "A002",
"name": "James",
"math": 89,
"physics": 76,
"chemistry": 51
},
{
"id": "A003",
"name": "Jenny",
"math": 79,
"physics": 90,
"chemistry": 78
}]
}
Utilice el siguiente código para formatear el contenido completo:
Ejemplo
df = pd.read_json('nested_list.json')
print(df)
El resultado del ejemplo anterior es:
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...
En este momento necesitamos usarjson_normalize()método para analizar completamente los datos anidados:
Ejemplo
import json
# Usar el módulo JSON de Python para cargar datos
with open('nested_list.json','r') as f:
data = json.loads(f.read())
# Aplanar datos
df_nested_list = pd.json_normalize(data, record_path =['students'])
print(df_nested_list)
El resultado del ejemplo anterior es:
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())Usar el módulo JSON de Python para cargar datos.
json_normalize()Se utilizó el parámetrorecord_pathy se estableció en['students']para expandir los datos JSON anidadosstudents。
El resultado mostrado aún no incluye los elementos school_name y class. Si necesita mostrarlos, puede usar el parámetro meta para mostrar estos metadatos:
Ejemplo
import json
# Usar el módulo JSON de Python para cargar datos
with open('nested_list.json','r') as f:
data = json.loads(f.read())
# Aplanar datos
df_nested_list = pd.json_normalize(
data,
record_path =['students'],
meta=['school_name', 'class']
)
print(df_nested_list)
El resultado del ejemplo anterior es:
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
A continuación, intentemos leer datos JSON más complejos, que anidan listas y diccionarios. El archivo de datosnested_mix.jsones el siguiente:
Contenido del archivo nested_mix.json
"school_name": "local primary school",
"class": "Year 1",
"info": {
"president": "John Kasich",
"address": "ABC road, London, UK",
"contacts": {
"email": "[email protected]",
"tel": "123456789"
}
},
"students": [
{
"id": "A001",
"name": "Tom",
"math": 60,
"physics": 66,
"chemistry": 61
},
{
"id": "A002",
"name": "James",
"math": 89,
"physics": 76,
"chemistry": 51
},
{
"id": "A003",
"name": "Jenny",
"math": 79,
"physics": 90,
"chemistry": 78
}]
}
Convertir el archivo nested_mix.json a DataFrame:
Ejemplo
import json
# Usar el módulo JSON de Python para cargar datos
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)
El resultado del ejemplo anterior es:
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
Leer un conjunto de datos de los datos anidados
El siguiente es el archivo de ejemplonested_deep.json, solo leemos elmathcampo:
Contenido del archivo nested_deep.json
"school_name": "local primary school",
"class": "Year 1",
"students": [
{
"id": "A001",
"name": "Tom",
"grade": {
"math": 60,
"physics": 66,
"chemistry": 61
}
},
{
"id": "A002",
"name": "James",
"grade": {
"math": 89,
"physics": 76,
"chemistry": 51
}
},
{
"id": "A003",
"name": "Jenny",
"grade": {
"math": 79,
"physics": 90,
"chemistry": 78
}
}]
}
Aquí necesitamos usar elglommódulo para manejar el anidamiento de datos,glomel módulo nos permite usar.para acceder a las propiedades de los objetos anidados.
Para el primer uso, necesitamos instalar glom:
pip3 install glom
Ejemplo
from glom import glom
df = pd.read_json('nested_deep.json')
data = df['students'].apply(lambda row: glom(row, 'grade.math'))
print(data)
El resultado del ejemplo anterior es:
0 60 1 89 2 79 Name: students, dtype: int64
Convertir DataFrame a JSON
DataFrame.to_json() - Convertir DataFrame a datos JSON
El método to_json() se utiliza para convertir DataFrame a datos en formato JSON, y se puede especificar el método de estructuración de JSON.
Formato de sintaxis:
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' o 'split')
encoding='utf-8' # 编码格式
)Descripción de parámetros:
| Parámetro | Descripción | Valor predeterminado |
|---|---|---|
path_or_buffer | La ruta del archivo de salida o el objeto de archivo, si esNone, entonces devuelve una cadena JSON | None |
orient | Especifica la estructura del formato JSON, admitesplit、records、index、columns、values | None(el valor predeterminado escolumns) |
date_format | Formato de fecha, admite'epoch'o'iso'formato | None |
default_handler | Manejador personalizado para tipos no estándar (comodatetimeetc.) función de procesamiento | None |
lines | Si se debe generar cada fila de datos como una línea (aplicable arecordsosplit) | False |
encoding | Formato de codificación del archivo de salida | 'utf-8' |
Ejemplo
# Crear DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']
})
# Convertir DataFrame a cadena JSON
json_str = df.to_json()
print(json_str)
Convertir DataFrame a archivo JSON (especificar orient='records'):
Ejemplo
# Crear DataFrame
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Los Angeles', 'Chicago']
})
# Convertir DataFrame a archivo JSON, especificando orient='records'
df.to_json('data.json', orient='records', lines=True)
# Salida del contenido del archivo generado:
# [
# {"Name":"Alice","Age":25,"City":"New York"},
# {"Name":"Bob","Age":30,"City":"Los Angeles"},
# {"Name":"Charlie","Age":35,"City":"Chicago"}
# ]
Convertir DataFrame a JSON y especificar el formato de fecha:
Ejemplo
# Crear DataFrame con datos de fecha
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 DataFrame a JSON y especificar el formato de fecha como '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}} Otras extensiones