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ónMétodoDescripción
Leer datos desde archivo/cadena JSONpd.read_json()Leer datos JSON y cargarlos como DataFrame
Convertir DataFrame a JSONDataFrame.to_json()Convierte DataFrame a datos en formato JSON, se puede especificar el método de estructuración
Métodos de estructuración JSON compatiblesorientParámetroAdmite 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

[ { "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 } ]

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ámetroDescripciónValor predeterminado
path_or_bufferRuta del archivo JSON, cadena JSON o URLParámetro obligatorio
orientDefine el método de formato de los datos JSON. Los valores comunes son:split、records、index、columns、values。None(inferido automáticamente del archivo)
dtypeForzar la especificación del tipo de dato de las columnasNone
convert_axesSi se convierten los ejes a tipos de datos apropiadosTrue
convert_datesSi se analizan las fechas como tipo fechaTrue
keep_default_naSi se conservan los marcadores de valores faltantes predeterminados (comoNaN)True

Opciones comunes del parámetro orient:

Valor de orientEjemplo de formato JSONDescripció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

import pandas as pd

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

import pandas as pd

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

import pandas as pd


# 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

import pandas as pd

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

import pandas as pd

# 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

import pandas as pd

# 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

import pandas as pd

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 pandas as pd
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 pandas as pd
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 pandas as pd
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

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)

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ámetroDescripciónValor predeterminado
path_or_bufferLa ruta del archivo de salida o el objeto de archivo, si esNone, entonces devuelve una cadena JSONNone
orientEspecifica la estructura del formato JSON, admitesplit、records、index、columns、valuesNone(el valor predeterminado escolumns)
date_formatFormato de fecha, admite'epoch'o'iso'formatoNone
default_handlerManejador personalizado para tipos no estándar (comodatetimeetc.) función de procesamientoNone
linesSi se debe generar cada fila de datos como una línea (aplicable arecordsosplit)False
encodingFormato de codificación del archivo de salida'utf-8'

Ejemplo

import pandas as pd

# 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

import pandas as pd

# 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

import pandas as pd

# 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>
Salida:
{"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