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