Limpieza de códigos de productos con Pandas

Resumen

Limpiar códigos de productos con Pandas es una tarea clave cuando trabajas con datos de comercio internacional y necesitas cruzar información entre archivos y bases de datos como Postgres. Aquí aprendes a transformar códigos de longitud variable, extraer la categoría padre y dejar un data frame listo para enriquecer tu análisis.

Este flujo te sirve si trabajas en ingeniería de datos, análisis de comercio exterior o cualquier proyecto que requiera unir descripciones jerárquicas con identificadores numéricos.

¿Por qué usar Pandas para limpieza de datos jerárquicos?

Pandas y Python son herramientas centrales en ingeniería de datos porque permiten extraer información, unir data frames, aplicar funciones personalizadas y dejar la data lista para análisis. En este caso, el reto es que los códigos de productos vienen con longitudes distintas y necesitan recortarse para hacer match con la base de datos de trades en Postgres.

El dataset inicial trae varias columnas relevantes [00:55]:

  • order: un incremental que identifica la fila.
  • code_col: el código del producto, base para el cruce con Postgres.
  • Descripción del producto y referencia al padre o predecesor.
  • Nivel jerárquico, donde el nivel dos agrupa categorías de alto nivel.

El primer obstáculo aparece rápido: hay registros con code_col en nulo y descripciones poco claras, así que esos se descartan filtrando con notnull() [01:55].

¿Qué es un merge en Pandas? Es la operación que une dos data frames usando una columna común como llave, similar a un JOIN en SQL.

¿Cómo identificar la longitud correcta del código?

Los seis primeros dígitos del código hacen match con los trades en Postgres, pero hay un detalle: no todos los códigos tienen la misma longitud. Los que pertenecen a un padre de un solo dígito tienen 11 caracteres, mientras que el resto tiene 12 [02:50].

Esa diferencia de longitud es la lógica que vas a usar para recortar correctamente. Si el código tiene 11 caracteres, tomas los primeros cinco para el código limpio y el primer dígito para el padre. Si tiene 12, tomas los primeros seis y los dos primeros para el padre.

¿Cómo construir la función clean_code?

La función clean_code recibe un texto, lo convierte a string y aplica la lógica condicional según la longitud [03:30]:

python def clean_code(text): text = str(text) parent_code = '' if len(text) == 11: code = text[:5] parent_code = text[:1] else: code = text[:6] parent_code = text[:2] try: parent = df_parents[df_parents['code_col'] == parent_code]['description'].values[0] except: parent = '' return code, parent

El bloque try/except es importante: si no encuentra coincidencia en df_parents, devuelve un valor vacío en lugar de romper el proceso. La función retorna una tupla con el código limpio y la descripción del padre.

¿Para qué sirve el try except aquí? Protege el flujo cuando un parent_code no existe en el data frame de padres y evita que el script se detenga.

¿Cómo aplicar la función a todo el data frame?

Para ejecutar clean_code sobre cada fila usas apply con una función lambda, especificando axis=1 para recorrer filas y result_type='expand' para que la tupla se separe en dos columnas [05:50]:

python df_codes[['clean_code', 'parent_description']] = df_codes.apply( lambda x: clean_code(x['code']), axis=1, result_type='expand' )

Después del apply cada registro queda con dos columnas nuevas. Por ejemplo, un código clasificado como animales vivos de tipo bovino aparece con su parent_description igual a Live Animals [06:40], lo que da contexto inmediato sobre la categoría.

¿Qué columnas conservar al final?

Una vez generadas las columnas nuevas, filtras los registros donde clean_code no sea nulo y reduces el data frame a lo esencial:

  • code: el código original.
  • clean_code: el código recortado para cruzar con Postgres.
  • description: la descripción del producto.
  • parent_description: la categoría padre que engloba el producto.

Con esa estructura puedes filtrar por categorías de alto nivel y enriquecer tus análisis sin perder el detalle del producto individual.

¿Qué ganas con este proceso de limpieza?

Obtienes un data frame compacto donde cada fila tiene un identificador limpio listo para hacer merge contra la tabla de trades en Postgres, más la descripción del producto y la categoría jerárquica superior. Esto te permite agrupar importaciones y exportaciones por familias de productos, no solo por códigos individuales.

La lógica detrás es simple pero potente: una sola función diferencia entre dos longitudes de código y resuelve dos problemas a la vez, el recorte para el cruce y la búsqueda del padre.

En la siguiente clase vas a limpiar los países y unir todo en un único data frame. Cuéntame en los comentarios qué otros casos de limpieza con Pandas te gustaría resolver.