Transformación de datos JSON en Pandas: de filas a columnas y viceversa

Conversión de objetos JSON en múltiples columnas

Cuando una celda contiene una cadena JSON que representa un objeto, el objetivo es expandir cada clave como una columna nueva. El flujo conssite en parsear el texto a un diccionario con json.loads() y luego aplanar el resultado con pd.json_normalize().

import pandas as pd
import json

registros = {
    "identificador": [101, 102, 103],
    "info_usuario": [
        '{"nombre": "Ana", "edad": 30, "activo": true}',
        '{"nombre": "Bruno", "edad": 40, "activo": false}',
        '{"nombre": "Carla", "edad": 35, "activo": true}'
    ]
}

df = pd.DataFrame(registros)

# Parsear JSON a diccionario
df["info_usuario"] = df["info_usuario"].apply(json.loads)

# Aplanar cada diccionario en columnas
df = pd.concat(
    [df.drop(columns=["info_usuario"]), pd.json_normalize(df["info_usuario"])],
    axis=1
)

df

Conversión de arrays JSON en múltiples filas

Si la columna contiene cadenas JSON que representan listas, el método explode() genera una fila por cada elemento del array. El orden es clave: primero se convierte la cadena a lista y después se expande.

import pandas as pd
import json

registros = {
    "identificador": [201, 202, 203],
    "lista_usuarios": [
        '[{"nombre": "Ana", "edad": 30, "activo": true}, {"nombre": "Bruno", "edad": 40, "activo": false}]',
        '[{"nombre": "Carla", "edad": 35, "activo": true}, {"nombre": "David", "edad": 45, "activo": false}]',
        '[{"nombre": "Eva", "edad": 25, "activo": true}]'
    ]
}

df = pd.DataFrame(registros)

df["lista_usuarios"] = df["lista_usuarios"].apply(json.loads)
df = df.explode("lista_usuarios").reset_index(drop=True)

df

Aplanado completo: array JSON a columnas

Combinando ambas operaciones se puede transformar un array JSON en varias filas y, a continuación, expandir cada objeto en columnas individuales. Esto es útil cuando cada elemento del array contiene múltiples campos que se necestian como variables separadas.

import pandas as pd
import json

registros = {
    "identificador": [301, 302, 303],
    "lista_usuarios": [
        '[{"nombre": "Ana", "edad": 30, "activo": true}, {"nombre": "Bruno", "edad": 40, "activo": false}]',
        '[{"nombre": "Carla", "edad": 35, "activo": true}, {"nombre": "David", "edad": 45, "activo": false}]',
        '[{"nombre": "Eva", "edad": 25, "activo": true}]'
    ]
}

df = pd.DataFrame(registros)

df["lista_usuarios"] = df["lista_usuarios"].apply(json.loads)
df = df.explode("lista_usuarios").reset_index(drop=True)

df = pd.concat(
    [df.drop(columns=["lista_usuarios"]), pd.json_normalize(df["lista_usuarios"])],
    axis=1
)

df

Etiquetas: pandas json json-normalize data-transformation explode

Publicado el 7-4 06:04