La base de todo proyecto exitoso de ciencia de datos es datos limpios y consistentes. Sin embargo, en el dinámico proceso de análisis, incluso usuarios experimentados de Python a veces tropiezan con trampas de preprocesamiento de datos evitables. Ya sea que estés dando forma a datos para un modelo de aprendizaje automático o preparándolos para visualización, saber qué errores vigilar puede ahorrarte innumerables horas de frustración y conducir a resultados mucho más sólidos.
Desglosemos cinco de los errores de limpieza de datos más comunes (y a menudo mortales) en Python, completos con consejos prácticos y ejemplos ilustrativos para que puedas mantener tus flujos de trabajo sólidos y eficientes.
Uno de los primeros problemas que encontrarás en cualquier conjunto de datos del mundo real es la presencia de datos faltantes. En Python, especialmente con herramientas como pandas, reemplazar o eliminar NaN es fácil: df.dropna() o df.fillna(0) lo hacen en una sola línea. Pero lo fácil no significa correcto.
Eliminar filas con valores ausentes automáticamente puede reducir drásticamente tu conjunto de datos o, como en los casos en que la ausencia está correlacionada, introducir sesgo. Rellenar valores con la media o cero puede distorsionar las distribuciones, especialmente en columnas no numéricas o aquellas con valores atípicos.
Considere este fragmento:
# Too hasty with missing value treatment
import pandas as pd
df = pd.read_csv('survey.csv')
df = df.dropna() # Danger: goodbye valuable data!
Si el 30% de filas tienen falta de un solo campo opcional, por ejemplo, la edad, perderías el 30% de tus datos. Si las edades faltantes se encuentran principalmente en un grupo demográfico específico, el resultado es un conjunto de datos que ya no refleja con precisión a la población.
Inspecciona antes de actuar: Usa df.isnull().sum() o df.info() para ver patrones de valores ausentes.
Considera el contexto: Por ejemplo, la edad faltante en datos de salud podría necesitar una etiqueta especial ('desconocido') en lugar de eliminarse o rellenarse.
Aprovecha técnicas como la imputación: Considera sklearn.impute.SimpleImputer para un rellenado informado, o lógica específica del dominio.
Documenta cada paso de limpieza de datos: Añade comentarios que expliquen por qué eliminaste o rellenaste valores, asegurando transparencia para usuarios futuros.
Los datos obtenidos de múltiples fuentes rara vez encajan de forma limpia en un solo formato. Las fechas, las categorías y las codificaciones de cadenas son especialmente propensas a errores sutiles y difíciles de rastrear.
dtype: object), desactivando operaciones numéricas.Problema clásico de Python:
# Date times imported as strings, causing issues
import pandas as pd
df = pd.read_csv('sales.csv')
df['created_at'].min() # Only finds the minimum string, not chronological min
df.dtypes expone rápidamente columnas que deberían ser numéricas pero no lo son.pd.to_datetime(), pd.to_numeric(), y conversiones de categorías tan pronto como importes los datos..str.lower().str.strip() para columnas de categoría; reemplaza sinónimos o errores tipográficos por un valor consistente.encoding (encoding='utf-8' o encoding='cp1252').df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')
df = df.dropna(subset=['created_at']) # Remove rows where dates couldn't parse
Un poco de atención aquí evita horas de depuración de analíticas extrañas más adelante.
Los valores atípicos son los comodines de la limpieza de datos; a veces señalan errores de entrada de datos; otras veces, son precisamente los eventos que vale la pena estudiar!
Los scripts automatizados que eliminan valores fuera de un rango determinado sin considerar el contexto pueden privar a los datos tanto de errores como de señales importantes.
# Don't just drop anything >200 without context
bp_outliers = df[df['blood_pressure'] > 200]
print(bp_outliers) # Investigate: are these errors or medically relevant cases?
df.describe() y visualizaciones como box plots o histogramas para revelar detalles de la distribución y detectar valores atípicos.Cuando los valores atípicos resultan ser válidos, pueden reformular las percepciones empresariales impulsadas por los datos.
Los datos duplicados están muy extendidos: errores de entrada de datos, extracción web o fallas del sistema los introducen. Aunque Python te permite df.drop_duplicates() en un instante, el peligro real está en malinterpretar de dónde provienen los duplicados, o en la mejor forma de resolverlos.
# Problematic: Dropping all duplicates based only on 'order_id'
df = df.drop_duplicates(subset=['order_id']) # Could lose different addresses or notes attached to split-row orders
Si columnas como 'delivery_notes' difieren entre filas, eliminar duplicados a ciegas o bien pierde datos o no logra reconciliar información conflictiva.
df.duplicated(subset=key_cols, keep=False) para marcar duplicados verdaderos.is_duplicate para análisis posteriores es preferible a eliminarlo por completo.Aquí tienes cómo podrías agregar campos potencialmente útiles antes de la deduplicación:
def collapse_order_notes(notes):
return '; '.join(sorted(set(x for x in notes if pd.notnull(x))))
rollup = df.groupby('order_id').agg({
'customer_id': 'first',
'total_amount': 'sum',
'delivery_notes': collapse_order_notes
}).reset_index()
Esto protege datos auxiliares importantes.
Muchos algoritmos potentes requieren entradas numéricas, no etiquetas de cadena directas o categorías. Codificar columnas categóricas es un paso crucial, pero apresurarse o elegir el método incorrecto puede degradar el rendimiento del modelo e introducir errores.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
# Label encoding ignores category meaning
le = LabelEncoder()
df['city_code'] = le.fit_transform(df['city']) # Problem: Model interprets numbers mathematically
0,1,2) si las etiquetas tienen un orden natural (p. ej., tamaño: S < M < L). De lo contrario, opta por one-hot u otras codificaciones.pd.get_dummies(df, drop_first=True, dummy_na=False), o para características de alta cardinalidad, considera hashing o codificación objetivo.fit/transform de sklearn) para que el despliegue del modelo obtenga mapeos idénticos; una trampa clásica cuando aparecen nuevas categorías no vistas en entradas del mundo real.city_counts = df['city'].value_counts()
# Only encode cities appearing at least 10 times
common_cities = city_counts[city_counts > 10].index
df['city'] = df['city'].apply(lambda x: x if x in common_cities else 'Other')
df = pd.get_dummies(df, columns=['city'], drop_first=True)
Esto mantiene el tamaño de las características práctico y los modelos robustos.
La limpieza de datos en Python exige prestar atención tanto a los detalles sutiles como a la rapidez. Al evitar limpiezas mecánicas o sin contexto, elevas tu trabajo de ciencia de datos y analítica mucho por encima del promedio. Revisa los valores faltantes con intención, aporta consistencia a los formatos, trata los valores atípicos como señales y no solo como ruido, examina los duplicados y piensa de forma táctica sobre la codificación de categorías.
Equipado con estas lecciones y un ojo crítico para tus datos, pasarás menos tiempo retrocediendo, minimizarás errores vergonzosos en producción y construirás una reputación por diseñar pipelines de datos en los que los analistas confían. Y en el campo en constante crecimiento de la ciencia de datos, convertirse en la persona cuyos datos están realmente listos para obtener insights es un verdadero superpoder.