0% encontró este documento útil (0 votos)
19 vistas26 páginas

Uso de pd.json_normalize y explode en Pandas

pd.json_normalize() convierte datos en formato JSON dentro de un DataFrame en columnas normales, facilitando la organización y análisis de datos. Además, se utilizan funciones como explode() para descomponer listas en filas y reset_index() para reordenar índices después de manipular datos. También se abordan técnicas para limpiar y convertir tipos de datos, como transformar cadenas a enteros y limpiar texto.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
19 vistas26 páginas

Uso de pd.json_normalize y explode en Pandas

pd.json_normalize() convierte datos en formato JSON dentro de un DataFrame en columnas normales, facilitando la organización y análisis de datos. Además, se utilizan funciones como explode() para descomponer listas en filas y reset_index() para reordenar índices después de manipular datos. También se abordan técnicas para limpiar y convertir tipos de datos, como transformar cadenas a enteros y limpiar texto.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

¿Qué hace pd.json_normalize()?

Cuando tienes una columna que contiene datos en formato JSON (o diccionarios dentro de listas),
pd.json_normalize() sirve para convertir ese JSON en columnas normales de un DataFrame.

Es decir:

Desarma el JSON y lo convierte en una tabla.

Tu código

datos = pd.json_normalize(datos['info_inmuebles'])

[Link]()

¿Qué significa?

datos['info_inmuebles']

Es una columna del DataFrame llamada info_inmuebles.

Esta columna seguramente tiene datos así:

"precio": 500000,

"direccion": "Zona 10",

"cuartos": 3

o una lista de diccionarios.

pd.json_normalize(...)

Convierte esos diccionarios en columnas normales.


[Link]()

Muestra las primeras 5 filas.

Ejemplo sencillo

Imagina que tienes un DataFrame así:

import pandas as pd

datos = [Link]({

"info_inmuebles": [

{"precio": 500000, "direccion": "Zona 10", "cuartos": 3},

{"precio": 350000, "direccion": "Zona 5", "cuartos": 2},

{"precio": 800000, "direccion": "Carretera a El Salvador", "cuartos": 4}

})

Ahora aplicas:

df = pd.json_normalize(datos['info_inmuebles'])

Y el resultado será este DataFrame:

precio direccion cuartos

500000 Zona 10 3

350000 Zona 5 2

800000 Carretera a El Salvador 4


Es decir:

✔ Cada key del JSON se vuelve una columna

✔ Cada fila sigue la posición original del JSON en la columna

¿Por qué se usa esto?

Porque a veces los datos vienen así:

columna info_inmuebles → dentro viene un JSON enorme

Entonces json_normalize sirve para:

➡ extraer

➡ organizar

➡ convertir en tabla normal

________________________________________________________________________________
________________________________________________

✔ Explicación sencilla

Cuando escribes:

columnas = list([Link])

Estás haciendo dos cosas:


1. [Link]

Obtiene los nombres de todas las columnas del DataFrame.

Por ejemplo:

Si tu DataFrame tiene:

| precio | direccion | cuartos |

Entonces [Link] es:

Index(['precio', 'direccion', 'cuartos'], dtype='object')

2. list(...)

Convierte ese "Index" en una lista de Python.

✔ Resultado

columnas ahora contiene:

['precio', 'direccion', 'cuartos']

✔ ¿Para qué sirve?

Para recorrer columnas en un ciclo

Para seleccionar columnas específicas


Para ver de forma rápida los nombres

Para reordenarlas o trabajar con ellas

________________________________________________________________________________
_________________________________________________________________

¿Qué hace este código?

datos = [Link](columnas[3:])

Lo que hace es “explotar” (convertir en varias filas) todas las columnas que están desde la
posición 3 en adelante en la lista columnas.

Es decir:

Si una columna tiene listas dentro, explode() toma cada elemento de la lista y lo convierte en una
fila nueva.

Ejemplo sencillo para entenderlo

Supongamos que tu DataFrame es así:

import pandas as pd

datos = [Link]({

"id": [1, 2],

"nombre": ["Casa A", "Casa B"],

"ubicacion": ["Zona 10", "Zona 5"],

"servicios": [["agua", "luz"], ["internet", "agua"]],

"precios": [[100, 150], [80, 120, 160]]

})
Y las columnas son:

columnas = ['id', 'nombre', 'ubicacion', 'servicios', 'precios']

Entonces:

columnas[3:] → ['servicios', 'precios']

Ahora aplicamos tu instrucción:

datos = [Link](columnas[3:])

Está explotando ambas columnas: servicios y precios.

Resultado después de explode

El DataFrame se convierte en:

id nombre ubicacion servicios precios

1 Casa A Zona 10 agua 100

1 Casa A Zona 10 luz 150

2 Casa B Zona 5 internet 80

2 Casa B Zona 5 agua 120

2 Casa B Zona 5 NaN 160

(la última fila puede variar según el contenido original)


¿Qué significa "explotar"?

Significa:

✔ Si una celda tenía una lista como ["agua", "luz"], ahora se divide en dos filas

✔ Y se repiten los valores que no son listas (id, nombre, ubicación)

En resumen

Tu código:

✔ Toma todas las columnas desde la número 3

✔ Busca listas dentro de esas columnas

✔ Las convierte en varias filas

✔ Mantiene el resto de datos igual

¿Por qué “Casa A” aparece dos veces si solo está una vez?

Porque lo que se repite NO es “Casa A”, lo que se repite es la fila completa para poder separar su
lista en varios elementos.

Mira este ejemplo:

"servicios": ["agua", "luz"]

Esa lista tiene 2 elementos → "agua" y "luz".


Cuando usas explode(), pandas tiene que convertir cada elemento de esa lista en una fila.

Entonces crea esto:

id nombre servicios

1 Casa A agua

1 Casa A luz

¿Ves?

El valor “Casa A” se repite porque pertenece a la misma fila original.

Explode no duplica la lista, duplica la fila para cada elemento de la lista.

Así cada elemento puede quedar en su propia fila.

Ejemplo claro paso por paso

Antes de explode:

id nombre servicios

1 Casa A ["agua", "luz"]

Después de explode:

Crea una fila para el primer elemento

Crea otra fila para el segundo elemento

id nombre servicios

1 Casa A agua

1 Casa A luz
Por eso se repite “Casa A”, porque sigue siendo la misma casa, pero ahora separada por cada
servicio.

Piensa en explode así:

Tenés una fila con una lista.

Pandas rompe la lista en varias filas.

Para que no se pierdan los demás datos, los repite.

________________________________________________________________________________
__________________________________________________

Tu código:

datos.reset_index(inplace=True, drop=True)

[Link]()

Aquí estás haciendo dos cosas:

1. reset_index(): Reiniciar el índice

El índice es la columna de la izquierda:

Ejemplo de índice:

índice nombre servicio

0 Casa A agua

1 Casa A luz

3 Casa B internet
A veces después de usar explode() o filtros, el índice queda saltado, así:

reset_index() sirve para poner el índice ordenado de nuevo, así:

2. inplace=True

Significa:

"Haz el cambio directamente en el DataFrame datos".

No crea uno nuevo.

Es como decir:

"Arréglalo ahí mismo".

3. drop=True
Esto es MUY IMPORTANTE.

❌ Si NO pusieras drop=True, el índice viejo aparecería como columna:

old_index nombre servicio

0 Casa A agua

1 Casa A luz

✔ Con drop=True, pandas no guarda el índice viejo, simplemente lo elimina.

Resultado final

Tu DataFrame queda con el índice así:

índice nombre servicio

0 Casa A agua

1 Casa A luz

2 Casa B internet

¿Para qué sirve?

✔ Para que tu DataFrame quede ordenado

✔ Para evitar índices repetidos

✔ Para que sea más fácil trabajar con él

✔ Para limpiar el DataFrame después de usar explode()

________________________________________________________________________________
_____________________________________________________________
datos['max_hospedes'] = datos['max_hospedes'].astype(np.int64) Ejemplo aca en mi dataframe de
datos max_hospedes tiene datos enteros pero los reconoce como objetc que es como un objeto o
un texto pero yo lo quiero reconocer como int entero entonces hago esto atos['max_hospedes'] =
datos['max_hospedes'].astype(np.int64)

Perfecto — te lo dejo paso a paso, muy fácil, con un ejemplo pequeño que puedes copiar y
ejecutar en tu Python. Voy a explicar qué hace cada línea para que no te quede duda.

1) Paso 0: crear un mini DataFrame de ejemplo (igualito a tu caso)

import pandas as pd

import numpy as np

datos = [Link]({

"evaluacion_general": ["buena", "mala", "excelente"],

"max_hospedes": ["2", "4", "3"] # estos son textos (strings)

})

Aquí max_hospedes parece número, pero está guardado como texto: "2", "4", "3".

2) Paso 1: ver cómo están los tipos ahora

print([Link]())

print([Link])

head() muestra las primeras filas.

dtypes te dice el tipo de cada columna (verás object para max_hospedes porque es texto).

3) Paso 2: convertir la columna a número — forma directa (cuando estás seguro que TODO es
número)
datos['max_hospedes'] = datos['max_hospedes'].astype(np.int64)

print([Link])

astype(np.int64) convierte a enteros.

Si todas las filas son textos que son números ("1", "2"...), esto funciona perfecto.

1. SI quieres, puedes usar numpy (pero no es obligatorio)

datos['columna'] = datos['columna'].astype(np.int64)

Esta forma funciona solo si todos los valores ya son números y no hay errores.

✅ 2. Puedes hacerlo SIN numpy (opción más usada y recomendada)

Pandas tiene su propia función:

datos['columna'] = datos['columna'].astype(int)

Eso hace exactamente lo mismo que np.int64.

Y también podrías usar:

datos['columna'] = pd.to_numeric(datos['columna'], errors='coerce')


Esta es la forma más segura, porque si encuentra un texto que NO es número, lo convierte en NaN
en vez de dar error.

En resumen (bien fácil)

¿Usar numpy? ¿Es obligatorio? ¿Cuándo se usa?

np.int64 ❌ No Si tú quieres un tipo específico de numpy

astype(int) No usa numpy Para convertir rápido a enteros

pd.to_numeric() Mejor opción Cuando puede haber errores en los datos

Ejemplo sin numpy

datos['max_hospedes'] = datos['max_hospedes'].astype(int)

Ejemplo sin numpy y seguro (mejor opción)

datos['max_hospedes'] = pd.to_numeric(datos['max_hospedes'], errors='coerce')

________________________________________________________________________________
__________________________________________________________

Lo que hiciste fue:

Crear una lista con los nombres de las 3 columnas.

Luego decirle a pandas:

“A TODAS estas columnas, conviértelas a enteros al mismo tiempo”.

¿Por qué es eficiente?

Porque en lugar de hacer esto:

datos['cantidad_baños'] = datos['cantidad_baños'].astype(np.int64)
datos['cantidad_cuartos'] = datos['cantidad_cuartos'].astype(np.int64)

datos['cantidad_camas'] = datos['cantidad_camas'].astype(np.int64)

Solo hiciste:

col_numericas = ['cantidad_baños', 'cantidad_cuartos', 'cantidad_camas']

datos[col_numericas] = datos[col_numericas].astype(np.int64)

Eso es:

más corto

más limpio

más rápido

más profesional

Resumen en una frase

Creaste una lista para seleccionar varias columnas y convertirlas todas juntas de texto a números,
sin escribir una línea por cada columna.

________________________________________________________________________________
__________________________________________________________________
Aquí te va la explicación más fácil posible, paso a paso y con un ejemplo claro.

✅ Tu código

datos['precio'] = datos['precio'].apply(lambda x: [Link]('$', '').replace(',', '').strip())

¿Qué está haciendo este código?

Está limpiando los precios, quitando símbolos y espacios.

Lo hace por partes:

apply(...)

Toma cada valor de la columna precio uno por uno.

lambda x:

Dice:

“para cada valor x, haz lo siguiente…”

[Link]('$', '')

Quita el símbolo de $.

Ejemplo: "$1,200" → "1,200"

.replace(',', '')

Quita las comas de miles.

"1,200" → "1200"

.strip()

Quita espacios al inicio y al final.


" 1200 " → "1200"

EJEMPLO SÚPER FÁCIL

⭐ Antes

Imagina que tu columna precio tiene esto:

precio

"$1,200 "

" $350"

"$ 99"

⭐ Después del código

Queda así:

precio

"1200"

"350"

"99"

Ahora está limpio y listo para convertir a número si querés:

datos['precio'] = datos['precio'].astype(int)

________________________________________________________________________________
_________________________________________________________

laro, vamos paso a paso y con un ejemplo sencillo


¿Qué hace esta línea?

datos['descripcion_local'].[Link]('[^a-zA-Z0-9\\s]', '', regex=True)

Limpia texto, quitando símbolos raros y dejando solo:

Letras (a–z, A–Z)

Números (0–9)

Espacios

Explicación simple por partes

1⃣ datos['descripcion_local']

Es una columna de texto de un DataFrame de pandas.

Ejemplo:

"Panadería #1 – Café & Té "

2⃣ .[Link]()

Sirve para reemplazar cosas dentro del texto.

3⃣ El patrón:

'[^a-zA-Z0-9\\s]'
Esto significa:

Parte Qué significa

^ dentro [] “todo lo que NO sea”

a-zA-Z letras

0-9 números

\\s espacios

[] conjunto de caracteres

En palabras simples:

“Busca todo lo que NO sea letra, número o espacio”

4️⃣ '' (cadena vacía)

Todo lo que encuentre, lo elimina.

5️⃣ regex=True

Le dice a pandas que use expresiones regulares (reglas de búsqueda avanzadas).

✨ Ejemplo práctico

Texto original:

"Panadería #1 – Café & Té "

Después de aplicar el código:

"Panadera 1 Caf T "


❌ Se eliminan:

&

acentos (é, í)

Se quedan:

Letras sin acento

Números

Espacios

Ejemplo en DataFrame

import pandas as pd

datos = [Link]({

'descripcion_local': ['Panadería #1 – Café & Té ']

})
datos['descripcion_limpia'] = datos['descripcion_local'].[Link](

'[^a-zA-Z0-9\\s]', '', regex=True

________________________________________________________________________________
_________________________________________

En pandas, esta expresión:

datos['descripcion_local'].[Link]()

hace lo siguiente, paso a paso:

1. datos['descripcion_local']

Selecciona la columna descripcion_local del DataFrame datos.

Esa columna normalmente contiene texto (strings).

Ejemplo:

"Restaurante de comida rápida"

2. .str

Indica que vas a aplicar operaciones de texto a cada valor de la columna.


Pandas usa .str para trabajar con strings fila por fila.

3. .split()

Divide el texto en partes usando un separador.

Si no le pasas nada, por defecto:

separa por espacios

elimina espacios extra

✅ Resultado final

Convierte cada texto en una lista de palabras.

Ejemplo:

"Restaurante de comida rápida"

se convierte en:

["Restaurante", "de", "comida", "rápida"]

Y toda la columna quedaría así:

0 ["Restaurante", "de", "comida", "rápida"]


1 ["Tienda", "de", "abarrotes"]

2 ["Café"]

¿Para qué sirve esto?

Es muy usado para:

Contar palabras

Buscar palabras clave

Limpieza de texto

Análisis de texto (NLP básico)

Ejemplo práctico:

datos['num_palabras'] = datos['descripcion_local'].[Link]().[Link]()

Cuenta cuántas palabras tiene cada descripción.

________________________________________________________________________________
____________________________--------

pd.to_datetime(dt_data['fecha']) convierte la columna fecha a tipo fecha y hora (datetime) en


pandas.

Explicado fácil
dt_data['fecha'] → es una columna (normalmente texto o números).

pd.to_datetime(...) → le dice a pandas:

“esto trátalo como fechas”.

¿Para qué sirve?

Para poder:

Ordenar por fecha

Filtrar por días, meses o años

Hacer cálculos de tiempo (días entre fechas)

Usar .[Link], .[Link], etc.

Ejemplo simple

Antes:

dt_data['fecha']

0 2024-01-15

1 2024-02-03

2 2024-02-20
(tipo string)

Convertimos:

dt_data['fecha'] = pd.to_datetime(dt_data['fecha'])

pd.to_datetime sirve para convertir datos a formato de fecha y hora (datetime) en pandas.

Dicho simple:

le enseña a pandas que esos datos son fechas, no solo texto.

¿Por qué es importante?

Porque cuando una columna es datetime, puedes:

✅ Ordenar por fecha

✅ Filtrar por rangos de tiempo

✅ Extraer año, mes, día

✅ Calcular diferencias de tiempo

✅ Hacer análisis temporal

Ejemplo básico

pd.to_datetime(['2024-01-01', '2024-02-15'])

Resultado:

DatetimeIndex(['2024-01-01', '2024-02-15'], dtype='datetime64[ns]')


Ejemplo con un DataFrame

df['fecha'] = pd.to_datetime(df['fecha'])

Antes → texto

Después → fecha real

Cosas que puedes hacer después

df['fecha'].[Link] # año

df['fecha'].[Link] # mes

df['fecha'].[Link] # día

df['fecha'].dt.day_name() # nombre del día

También podría gustarte