Técnicas Avanzadas de Pandas para Limpieza y Análisis Eficiente de Datos

Pandas es una biblioteca fundamental en Python para la manipulación y análisis de datos, indispensable en campos como la ciencia de datos, la estadística y la computación científica. Si bien el dominio de sus funciones básicas es crucial, la verdadera potencia de Pandas reside en la aplicación de técnicas avanzadas. Este artículo explorará métodos de alto nivel para la limpieza de datos, operaciones de datos eficientes y su integración con el aprendizaje automático.

Limpieza Avanzada de Datos con Pandas

Manejo de Valores Ausentes

Los valores faltantes son una ocurrencia común en conjuntos de datos reales. Pandas ofrece herrameintas efectivas para su detección y tratamiento:

  • Detección: Las funcionees isna() o notna() permiten identificar rápidamente los datos ausentes en un DataFrame. ```python

    import pandas as pd import numpy as np

    Datos de ejemplo con valores nulos

    datos_ejemplo = { 'Columna_A': [1, 2, np.nan], 'Columna_B': [4, np.nan, 6], 'Columna_C': [np.nan, 7, 8] } df_original = pd.DataFrame(datos_ejemplo)

    Verificar la presencia de nulos

    print(df_original.isna())

  • Eliminación/Relleno: El método dropna() puede eliminar filas o columnas que contengan valores nulos. Atlernativamente, fillna() permite sustituir los nulos por un valor específico, como la media. ```python

    Eliminar filas con al menos un valor nulo

    df_limpio = df_original.dropna()

    Rellenar nulos en 'Columna_A' con su media

    media_columna_a = df_original['Columna_A'].mean() df_relleno = df_original.fillna({'Columna_A': media_columna_a})

    
    

Gestión de Duplicados

Los registros duplicados pueden distorsionar el análisis. Pandas facilita su eliminación con drop_duplicates().


# Datos de ejemplo con filas duplicadas
datos_duplicados = {
    'ID': [101, 102, 101],
    'Nombre': ['Ana', 'Luis', 'Ana'],
    'Valor': [50, 60, 50]
}
df_con_duplicados = pd.DataFrame(datos_duplicados)

# Eliminar duplicados, manteniendo la primera ocurrencia
df_sin_duplicados = df_con_duplicados.drop_duplicates(keep='first')
print(df_sin_duplicados)

Operaciones de Datos Avanzadas

Combinación y Unión de Datos

Pandas ofrece métodos versátiles para fusionar y concatenar DataFrames:

  • Fusión (Merge): merge() combina DataFrames basándose en columnas clave. ```python

    df_izq = pd.DataFrame({'clave': ['X', 'Y', 'Z'], 'dato1': [1, 2, 3]}) df_der = pd.DataFrame({'clave': ['X', 'Y', 'W'], 'dato2': [4, 5, 6]})

    Fusión externa basada en 'clave'

    df_fusionado = df_izq.merge(df_der, on='clave', how='outer') print(df_fusionado)

  • Concatenación: concat() apila DataFrames vertical u horizontalmente. ```python

    Concatenación vertical (apilar filas)

    df_conc_vertical = pd.concat([df_izq, df_der], axis=0, ignore_index=True)

    Concatenación horizontal (apilar columnas)

    df_conc_horizontal = pd.concat([df_izq, df_der[['clave', 'dato2']]], axis=1)

    
    

Procesamiento de Series Temporales

Pandas es excepcionalmente eficiente para trabajar con datos de series temporales, especialmente utilizando DatetimeIndex.


# Generar un índice de fechas
fechas = pd.date_range(start='2024-01-15', periods=5, freq='B') # Días hábiles
df_tiempo = pd.DataFrame({'Ventas': np.random.randint(100, 500, size=5)}, index=fechas)

# Re-muestreo (ejemplo: agregar datos diarios a semanales)
df_semanal = df_tiempo.resample('W').sum()
print(df_semanal)

Optimización del Rendimiento en Pandas

Para conjuntos de datos grandes, la eficiencia es primordial. Considere estas optimizaciones:

  • Evitar Bucles: Prefiera operaciones vectorizadas sobre bucles for. ```python

    Datos de ejemplo

    df_rendimiento = pd.DataFrame({'Val1': [10, 20, 30], 'Val2': [5, 15, 25]})

    Método ineficiente (bucle)

    resultado_bucle = [] for i in range(len(df_rendimiento)): resultado_bucle.append(df_rendimiento['Val1'][i] * df_rendimiento['Val2'][i]) df_rendimiento['Resultado_Bucle'] = resultado_bucle

    Método eficiente (vectorizado)

    df_rendimiento['Resultado_Vectorizado'] = df_rendimiento['Val1'] * df_rendimiento['Val2'] print(df_rendimiento)

  • Uso de where y mask: Estas funciones permiten aplicar condiciones de forma eficiente. ```python

    Supongamos que tenemos una columna 'Puntuacion'

    df_rendimiento['Puntuacion'] = [5, -10, 15]

    Reemplazar valores negativos con 0 usando mask

    df_rendimiento['Puntuacion_Positiva'] = df_rendimiento['Puntuacion'].mask(df_rendimiento['Puntuacion'] < 0, 0) print(df_rendimiento)

  • Optimización de Memoria: Utilice tipos de datos apropiados (dtype) para reducir el consumo de memoria. ```python

    Ejemplo: convertir una columna de enteros grandes a un tipo más pequeño si es posible

    df_rendimiento['Val1_Reducido'] = df_rendimiento['Val1'].astype('int8') print(df_rendimiento.info())

    
    

Integración de Pandas con Aprendizaje Automático

Normalización de Datos

La preparación de datos para modelos de ML a menudo requiere normalización o estandarización. Pandas facilita esta tarea, a menudo en conjunto con bibliotecas como Scikit-learn.


from sklearn.preprocessing import StandardScaler

# Crear datos de ejemplo
datos_ml = {'Caracteristica1': [10, 20, 30, 40], 'Caracteristica2': [100, 150, 120, 180]}
df_ml = pd.DataFrame(datos_ml)

# Estandarizar las características
escalador = StandardScaler()
df_estandarizado_array = escalador.fit_transform(df_ml)
df_estandarizado = pd.DataFrame(df_estandarizado_array, columns=df_ml.columns)
print(df_estandarizado)

Ingeniería de Características

La creación de nuevas características a partir de datos existentes es un paso clave en ML. Pandas permite realizar esto de manera flexible.


# Crear DataFrame con fecha y texto
fechas_ml = pd.date_range(start='2024-05-01', periods=5, freq='D')
df_ingenieria = pd.DataFrame({
    'Fecha': fechas_ml,
    'Descripcion': ['manzana roja', 'pera verde', 'plátano amarillo', 'manzana verde', 'uva morada']
})

# Extraer el día de la semana de la columna 'Fecha'
df_ingenieria['Dia_Semana'] = df_ingenieria['Fecha'].dt.dayofweek

# Ejemplo básico de procesamiento de texto (contar palabras)
df_ingenieria['Num_Palabras'] = df_ingenieria['Descripcion'].apply(lambda x: len(x.split()))

print(df_ingenieria)

Dominar estas técnicas avanzadas de Pandas permite abordar de manera más efectiva problemas complejos de limpieza y análisis de datos, preparando el terreno para análisis posteriores y aplicaciones de aprendizaje automático.

Etiquetas: pandas Python data cleaning data manipulation time series

Publicado el 7-16 11:12