Limpiando detalles adicionales

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

Contenido del curso

Web scraping

Pandas

Resumen

Crear IDs únicos a partir de la URL y limpiar saltos de línea en un DataFrame de pandas garantiza calidad de datos y un índice confiable. Aquí verás cómo usar hashlib con MD5 para generar identificadores, y cómo eliminar new line characters del cuerpo de texto, tal como se muestra en Jupyter Notebook.

¿Cómo generar UIDs desde la URL con hashlib y pandas?

Para identificar cada registro de forma única, se crea un UID calculando un hash de la URL. Se usa hashlib con MD5 para obtener un número de 128 bits en representación hexadecimal. Aunque MD5 no es seguro para criptografía, sirve para este mapeo determinista de URLs a IDs.

import hashlib # 1) Generar el hash MD5 de la URL por fila y obtener su hex digest uids = ( universal .apply(lambda row: hashlib.md5(row['url'].encode('utf-8')), axis=1) .apply(lambda h: h.hexdigest()) ) # 2) Añadir la columna y establecerla como índice universal['uid'] = uids universal.set_index('uid', inplace=True)
  • Se usa .apply con axis=1 para trabajar por fila.
  • .encode('utf-8') convierte el string en bytes para hashlib.
  • .hexdigest() devuelve el hash en hexadecimal.
  • .set_index(..., inplace=True) actualiza el índice sin crear otro DataFrame.
  • Tip en Jupyter Notebook: presionar DD borra una celda.

¿Qué significa axis en apply y cómo recordarlo?

  • axis=1 procesa por filas.
  • axis=0 procesa por columnas.
  • Memorízalo: 1 → filas, 0 → columnas.

¿Por qué usar MD5 para UIDs (no criptográficos)?

  • Es rápido y determinista para mapear URL → ID.
  • Genera un identificador homogéneo de longitud fija.
  • No se recomienda para seguridad, pero es suficiente para indexar datos.

¿Cómo quitar new line characters del body con Python?

El objetivo es reemplazar los saltos de línea invisibles por espacios en la columna de texto, manteniendo el contenido en un solo string legible.

# 1) Extraer body por fila strip_body = ( universal .apply(lambda row: row['body'], axis=1) # 2) Convertir el string en lista de caracteres .apply(list) # 3) Reemplazar \n y \r por un espacio usando map .apply(lambda letters: list(map(lambda ch: ' ' if ch in ['\n', '\r'] else ch, letters))) # 4) Volver a unir la lista en un string .apply(lambda letters: ''.join(letters)) ) # 5) Sobrescribir la columna limpia universal['body'] = strip_body
  • list(body) divide el texto en caracteres.
  • map devuelve un iterable en Python 3: se convierte a list antes de unir.
  • Reemplazo explícito de '\n' y '\r' por espacios.
  • ''.join(letters) reconstruye el string limpio.

¿Cómo validar paso a paso sin perder contexto?

  • Ejecuta por partes en Notebook para inspeccionar salidas intermedias.
  • Verifica que el índice cambió a hashes y que el body ya no contiene saltos de línea.

¿Cómo dejarlo listo como receta reutilizable?

Tras probar los pasos, conviene convertirlos en funciones para reutilizarlos en el flujo de ETL.

def add_uid_from_url(df, url_col='url', uid_col='uid'): import hashlib uids = ( df.apply(lambda row: hashlib.md5(row[url_col].encode('utf-8')), axis=1) .apply(lambda h: h.hexdigest()) ) df[uid_col] = uids df.set_index(uid_col, inplace=True) return df def clean_newlines_in_body(df, body_col='body'): cleaned = ( df.apply(lambda row: row[body_col], axis=1) .apply(list) .apply(lambda letters: list(map(lambda ch: ' ' if ch in ['\n', '\r'] else ch, letters))) .apply(lambda letters: ''.join(letters)) ) df[body_col] = cleaned return df
  • Empaqueta la lógica en funciones fáciles de probar.
  • Usa parámetros para columnas como url, uid y body.
  • Retorna el mismo DataFrame para encadenar pasos en la receta.

¿Te quedó alguna duda sobre apply, axis o el reemplazo de caracteres? Deja tu pregunta en los comentarios y con gusto te ayudamos.