es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear múltiples columnas de manera eficiente en Pandas DataFrame

Estoy tratando de agregar alrededor de 2000 columnas en un dataframe que tiene alrededor de 450k registros usando ciertas condiciones, sin embargo, está tardando mucho tiempo. ¿Alguien puede proporcionar una solución eficiente en tiempo para esto? El código de muestra es así:

dict1={x:x for x in range(2000)}
Data = pd.DataFrame(np.random.randint(0,10000,size=(450000, 4)), columns=list('ABCD'))
for i in range(1,2000):
    Data[f'A_{i}']= Data['A'].apply(lambda x: max(0,min(5000,x) -dict1[i]))
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución podría ser utilizar el método apply con múltiples columnas en lugar de iterar a través de cada columna individualmente. Esto puede mejorar significativamente el rendimiento del código. Aquí tienes un ejemplo:

    import numpy as np
    import pandas as pd
    
    # crear un diccionario
    dict1 = {x: x for x in range(2000)}
    
    # crear un dataframe de ejemplo
    Data = pd.DataFrame(np.random.randint(0,10000,size=(450000, 4)), columns=list('ABCD'))
    
    # definir una función para aplicar a cada fila del dataframe
    def apply_func(row):
        return [max(0, min(5000, row['A']) - dict1[i]) for i in range(1, 2000)]
    
    # aplicar la función a cada fila del dataframe y crear nuevas columnas
    new_cols = pd.DataFrame(Data.apply(lambda row: apply_func(row), axis=1).tolist(), columns=[f'A_{i}' for i in range(1, 2000)])
    
    # concatenar las nuevas columnas con el dataframe original
    Data = pd.concat([Data, new_cols], axis=1)
    

    En esta solución, definimos una función apply_func que toma una fila del dataframe como entrada y devuelve una lista de valores calculados utilizando el diccionario dict1 y la columna ‘A’ del dataframe. Luego, utilizamos el método apply con axis=1 para aplicar esta función a cada fila del dataframe y crear un nuevo dataframe new_cols con los valores resultantes. Finalmente, concatenamos Data y new_cols a lo largo del eje de columnas para obtener el dataframe final con todas las nuevas columnas agregadas.

    Este método debería ser mucho más rápido que el enfoque original basado en bucles, ya que aprovecha la vectorización y las capacidades de procesamiento paralelo de pandas.

Comments are closed.