Limpieza de datos
Datos faltantes
Es muy frecuente que en una colección de datos de cierta entidad se observen campos en blanco o con una marca sustituta (ver tabla abajo), a consecuencia de diversos motivos, incluídos los errores de recogida de datos y la simple ausencia de éstos por no producirse determinada respuesta. Lo que en realidad importa para su tratamiento posterior es que las ausencias sean razonablemente escasas; en caso contrario, la calidad del conjunto de datos se ve muy seriamente comprometida.
| Entorno | Elemento |
|---|---|
| Python puro | None |
| Data Science (Pandas/NumPy) | NaN |
| Base de datos (SQL) | NULL |
| Lenguaje R | NA |
Las opciones disponibles para hacer frente a esta realidad son varias, desde la eliminación del registro hasta el relleno del campo con determinado valor, resultante de algún tipo de cálculo. Para conocer cuales son esas alternativas, además de consultar a la IA, que lo que hace es resumir el conjunto de posibilidades disponibles, sustituyendo así a una simple búsqueda web, también podemos consultar alguna página específicamente pensada para tratar este tema. Yo aquí te ofrezco un ejemplo de la segunda opción; la primera corre de tu cuenta.
No es por comodidad, pero en este caso voy a optar por la forma más simple de resolver el problema: eliminando el registro. No es precisamente la mejor solución, especialmente cuando no disponemos de muchos registros, pero sí la más adecuada para un caso como el que nos ocupa en el que no hay la pretensión de representatividad estadística ni interés por crear un procedimiento de (aprendizaje automático (AA). Además, en este caso, en la mayoría de los registros faltan todos los datos que pueden faltar, dado que son resultado de una opción de tratamiento del documento que ahora no me intersa comentar; sirva con decir que las tablas simplemente no están cumplimentadas, por lo que es hasta coherente eliminar estos registros. Puede que no lo sea tanto en los casos en que sólo falta la fecha, pero son muy escasos y el riesgo real de pérdida de información es mínimo.
import pandas as pd
import os
import numpy as np
# --- Función ---
def limpiar_tabla_especifica(ruta_absoluta):
if not os.path.exists(ruta_absoluta):
print(f"Error: No se localiza el archivo en {ruta_absoluta}")
return
try:
df = pd.read_csv(ruta_absoluta, sep=';', engine='python') # 1. Carga los datos con el separador identificado (sep=';')
total_inicial = len(df) # Conteo inicial para calcular los registros afectados
df = df.replace(r'^\s*$', np.nan, regex=True) # 2. Convertir espacios vacíos (" ") en nulos reales (NaN)
columnas_a_validar = ['fecha', 'SEO', 'OE'] # 3. Eliminar registros si falta dato en fecha-SEO-OE
df_limpio = df.dropna(subset=columnas_a_validar)
total_final = len(df_limpio) # 4. Cálcular los registros eliminados
eliminados = total_inicial - total_final
ruta_directorio = os.path.dirname(ruta_absoluta) # 5. Exportar el resultado a csv
nombre_salida = "lista_t1_sin_nulos.csv"
ruta_salida = os.path.join(ruta_directorio, nombre_salida)
df_limpio.to_csv(ruta_salida, sep=';', index=False)
print("-" * 30) # 6. Informe a mostrar por consola
print("INFORME DE PROCESAMIENTO")
print("-" * 30)
print(f"Registros analizados: {total_inicial}")
print(f"Registros eliminados (faltaba fecha, SEO o OE): {eliminados}")
print(f"Registros válidos restantes: {total_final}")
print(f"Archivo generado: {ruta_salida}")
except Exception as e:
print(f"Se produjo un error durante la ejecución: {e}")
# --- Llamada a la función ---
ruta_csv = r"" # Aqui la ruta de tu archivo csv
limpiar_tabla_especifica(ruta_csv) # Llamada a la función
Mediante este script eliminamos los registros que carecen de datos en las columnas (variables) de interés columnas_a_validar = ['fecha', 'SEO', 'OE'], cosa que sucede gracias al uso de la función df.dropna() de Pandas (df_limpio = df.dropna(subset=columnas_a_validar)). Al especificar el identificador de las columnas hacemos que el script sea dependiente de la tabla, a la vez que nos permite identificar lo que deberemos cambiar si cambiamos de tabla.
Y hablando de especificidades, debo decir que para que el script funcione ha sido necesario especificar el separador de campos de la tabla (ruta_absoluta, sep=';', engine='python')), ya que el csv-base utiliza ; en vez del esperado (,) por defecto por Pandas.
El resultado tiene una doble expresión: archivo como csv (comentario 5 del script) se muestra una síntesis por consola (comentario 6). No proporciono ninguna prueba por innecesaria; es suficiente con que pienses en la última tabla de esta entrada sin el registro INF_003.dot.
No hay comentarios:
Publicar un comentario
Comenta esta entrada