Cómo rellenar datos faltantes en Pandas con regex

Clase 27 de 38Curso de Ingeniería de Datos con Python

Contenido del curso

Web scraping

Pandas

Resumen

Trabaja con confianza tus análisis en Pandas: aprende a detectar y rellenar datos faltantes sin sesgar resultados y a extraer títulos desde URLs usando regex. Verás cómo una máscara booleana y el namespace de strings simplifican el flujo en Jupyter Notebook.

¿Por qué los datos faltantes afectan tus análisis en Pandas?

Los datos faltantes distorsionan agregaciones y distribuciones. Llenar con cero puede modificar radicalmente la distribución. Eliminar filas debilita la fuerza de las conclusiones. Por eso, Pandas ofrece utilidades para identificarlos y tratarlos con precisión.

  • Usa el concepto de NaN para marcar faltantes.
  • Identifica con isna y notna.
  • Elimina con dropna cuando sea justificable.
  • Rellena con fillna usando un centinela (por ejemplo, −1 si la serie es positiva).
  • Considera usar el último valor previo si los datos llegan en secuencia.

¿Cómo identificar, filtrar y rellenar NaN con máscaras booleanas?

La clave es crear una máscara booleana con isna sobre la columna objetivo (por ejemplo, el título) y usarla para indexar solo los registros faltantes. Luego, extrae el último fragmento de la URL y transfórmalo en el título limpio.

  • En lugar de eliminar, completa usando información de la URL.
  • Genera una serie con la posición de los faltantes e índices.
  • Indexa con la máscara: donde haya True, actualiza.
# Generar la máscara de títulos faltantes df = el_universal # DataFrame de trabajo missing_titles_mask = df['title'].isna() # Vista rápida: posiciones de los NaN missing_positions = missing_titles_mask[missing_titles_mask] print(missing_positions.index)

¿Qué funciones clave de Pandas usar para missing values?

  • isna: localiza faltantes en una columna o DataFrame.
  • notna: encuentra valores completos.
  • dropna: elimina registros con NaN cuando conviene.
  • fillna: rellena con centinelas o reglas simples.

Suma a esto el namespace .str para trabajar con strings y .dt para date times. Evita depender de dot notation con nombres de columnas ambiguos; mejor usa la notación de diccionario para estabilidad.

¿Cómo extraer el último fragmento de la URL con regex?

Se usa .str.extract con una regex que capture el último pedazo tras la última “/”. Emplea raw strings con prefijo r.

# Extraer el último fragmento de la URL como candidato de título last_segment = ( df.loc[missing_titles_mask, 'url'] .str.extract(r'(?P<missing_titles>[^/]+)$', expand=False) )
  • [^/]+$: toma todo hasta el final sin incluir otra “/”.
  • (?P<missing_titles>...): grupo nombrado útil para lectura.
  • expand=False: devuelve una serie directa.

¿Cómo limpiar guiones y formar el título legible?

Convierte los guiones en espacios: primero divide en palabras y luego únelas. Encadena operaciones dentro de paréntesis; en Python, los saltos de línea dentro de paréntesis son seguros.

clean_titles = ( last_segment .apply(lambda s: s.split('-')) # de "kim-kardashian" a ["kim","kardashian"] .apply(lambda w: ' '.join(w)) # de lista a "kim kardashian" .apply(lambda s: s.title()) # opcional: capitalización estilo título ) # Asignar de vuelta solo donde faltaba el título df.loc[missing_titles_mask, 'title'] = clean_titles
  • Usa lambda para transformaciones rápidas.
  • Cuando trabajes con DataFrame, considera applymap para aplicar función a todas las celdas.
  • Trabaja con máscara booleana para garantizar que solo se modifican los NaN.

¿Cómo limpiar y transformar textos con str, applymap y lambda?

El namespace .str expone funciones de texto encadenables; combinadas con .apply o applymap, permiten mapear y transformar valores de forma clara. Esto evita eliminar registros cuando la URL ya contiene el título escondido.

  • Encadena pasos dentro de paréntesis para legibilidad.
  • Reemplaza símbolos no deseados (como guiones) por espacios.
  • Mantén el acceso por notación de diccionario para evitar colisiones futuras.
# Patrón de trabajo recomendado con encadenamiento extracted = ( df.loc[missing_titles_mask, 'url'] .str.extract(r'(?P<missing_titles>[^/]+)$', expand=False) ) transformed = ( extracted .apply(lambda s: s.split('-')) .apply(lambda parts: ' '.join(parts)) ) df.loc[missing_titles_mask, 'title'] = transformed

¿Te gustaría ver variantes con otras reglas de limpieza o más ejemplos de regex adaptados a tus URLs? Comparte tu caso en los comentarios y afinamos la solución juntos.