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 digestuids =( 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 índiceuniversal['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 filastrip_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 limpiauniversal['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.