Notas de estudio de Python cincuenta y seis (Pandas JSON)

Pandas JSON

JSON (Notación de objetos JavaScript, notació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 obtener más contenido JSON, consulte el tutorial de JSON.

Pandas puede procesar datos JSON de manera muy conveniente. Este artículo toma sites.json como ejemplo y el contenido es el siguiente:

[
   {
    
    
   "id": "A001",
   "name": "百度",
   "url": "www.baidu.com",
   "likes": 95
   },
   {
    
    
   "id": "A002",
   "name": "Google",
   "url": "www.google.com",
   "likes": 112
   },
   {
    
    
   "id": "A003",
   "name": "淘宝",
   "url": "www.taobao.com",
   "likes": 66
   }
]

leer_json()

# 实例 1
import pandas as pd
df = pd.read_json('sites.json')
print(df.to_string())

Encadenar()

to_string() se usa para devolver datos de tipo DataFrame y también podemos procesar cadenas JSON directamente.

# 实例 2
import pandas as pd
data =[
   {
    
    
   "id": "A001",
   "name": "百度",
   "url": "www.baidu.com",
   "likes": 95
   },
   {
    
    
   "id": "A002",
   "name": "Google",
   "url": "www.google.com",
   "likes": 112
   },
   {
    
    
   "id": "A003",
   "name": "淘宝",
   "url": "www.taobao.com",
   "likes": 66
   }
]
df = pd.DataFrame(data)
print(df)

Convertir diccionario a datos de DataFrame

Los objetos JSON tienen el mismo formato que los diccionarios de Python, por lo que podemos convertir directamente los diccionarios de Python en datos de DataFrame:

# 实例 3
import pandas as pd
# 字典格式的 JSON                                                                                              
s = {
    
    
    "col1":{
    
    "row1":1,"row2":2,"row3":3},
    "col2":{
    
    "row1":"x","row2":"y","row3":"z"}
}
# 读取 JSON 转为 DataFrame                                                                                          
df = pd.DataFrame(s)
print(df)

Datos JSON integrados

Supongamos que hay un conjunto de archivos de datos JSON anidados nested_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
    }]
}

Formatee el contenido completo con el siguiente código:

# 实例 4
import pandas as pd
df = pd.read_json('nested_list.json')
print(df)

json_normalizar()

En este momento necesitamos usar el método json_normalize() para analizar completamente los datos incrustados:

# 实例 5
import pandas as pd
import json
# 使用 Python JSON 模块载入数据
with open('nested_list.json','r') as f:
    data = json.loads(f.read())
# 展平数据
df_nested_list = pd.json_normalize(data, record_path =['students'])
print(df_nested_list)

data = json.loads(f.read()) Cargue datos usando el módulo Python JSON.

json_normalize() El parámetro record_path se utiliza y se establece en ['estudiantes'] para expandir los datos JSON integrados de los estudiantes.

Los resultados mostrados aún no contienen los elementos school_name y class. Si necesita mostrarlos, puede usar el parámetro meta para mostrar estos metadatos:

# 实例 6
import pandas as pd
import json
# 使用 Python JSON 模块载入数据
with open('nested_list.json','r') as f:
    data = json.loads(f.read())
# 展平数据
df_nested_list = pd.json_normalize(
    data,
    record_path =['students'],
    meta=['school_name', 'class']
)
print(df_nested_list)

A continuación, intentemos leer datos JSON más complejos, que son listas y diccionarios anidados. El archivo de datos nested_mix.json es 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
    }]
}

Archivo nested_mix.json convertido a DataFrame:

# 实例 7
import pandas as pd
import json
# 使用 Python JSON 模块载入数据
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)

Lea un conjunto de datos en los datos incrustados.
El siguiente es un archivo de ejemplo nested_deep.json. Solo leemos el campo matemático en los datos incrustados:

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 el módulo glom para manejar el anidamiento de datos. El módulo glom nos permite usar para acceder a las propiedades de los objetos incrustados.

Para usarlo por primera vez necesitamos instalar glom:

pip3 install glom

Uso adecuado del módulo glom para extraer campos de datos JSON anidados

# 实例 8
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)

Aquí hay una explicación detallada del código:

  • Primero, importamos los módulos pandas y glom. pandas es una biblioteca de Python para manipulación y análisis de datos, mientras que glom es una biblioteca para manipular y analizar datos JSON.
  • Luego, leemos un archivo JSON llamado 'nested_deep.json' usando la función read_json de pandas. Este archivo contiene información sobre los estudiantes y sus calificaciones.
  • Creamos una variable llamada datos y usamos la función de aplicación y la función lambda para recorrer cada fila en la columna df['estudiantes']. Para cada fila, usamos la función glom para extraer el campo 'matemático' del objeto 'calificación' de la fila.
  • Finalmente, imprimimos la variable de datos, que debería contener los puntajes de matemáticas de todos los estudiantes.

Si ejecuta este código y se asegura de que su entorno tenga pandas y glom instalados, debería ver una lista de las puntuaciones de matemáticas de todos los estudiantes.

posdata

Lo que estás aprendiendo hoy es Python Pandas JSON, ¿lo has aprendido? Un resumen del contenido de aprendizaje de hoy:

  1. Pandas JSON
  2. leer_json()
  3. Encadenar()
  4. Convertir diccionario a datos de DataFrame
  5. Datos JSON integrados
  6. json_normalizar()

Supongo que te gusta

Origin blog.csdn.net/qq_54129105/article/details/132261726
Recomendado
Clasificación