¿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