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.

Utilizando pool.map() en una sola columna de un DataFrame.

Estoy intentando paralelizar la aplicación de una función en un marco de datos de pandas. La manera fácil de hacerlo es:

pandarallel.initialize(progress_bar=True, verbose=0, use_memory_fs=True, nb_workers=2)
df.parallel_apply(lambda x: my_func(x['column1']), axis=1)

Sin embargo, por alguna razón, la biblioteca “pandarallel” parece no funcionar en mi caso. Por lo tanto, estoy pensando en hacerlo manualmente con “pool.map()”:

def parallelize_dataframe(df, func, n_cores=2):
    df_split = np.array_split(df, n_cores)
    pool = Pool(n_cores)
    df = pd.concat(pool.map(func, df_split))
    pool.close()
    pool.join()
    return df

df = parallelize_dataframe(df, my_func, n_cores=2)

Sin embargo, no sé cómo cambiar “pool.map()” para aplicarlo solo a ‘column1’ y obtener el código equivalente en la línea 2.

PD: “my_func” es una función que se supone que obtiene imágenes de una URL y les aplica una predicción de procesamiento de imágenes.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para aplicar la función solo en ‘column1’ usando pool.map(), puedes modificar el parámetro func en la función parallelize_dataframe(). Puedes definir una nueva función que tome una serie de pandas como entrada, extraiga el valor de ‘column1’ y aplique my_func() en él. Aquí tienes un ejemplo:

    def process_column1(series):
        result = pd.Series(series)  # crea una nueva serie con el mismo índice
        result['column1'] = my_func(series['column1'])  # aplica my_func() en column1 y asigna el valor
        return result
    
    df = parallelize_dataframe(df['column1'], process_column1, n_cores=2)
    

    En este ejemplo, estamos creando un nuevo dataframe con solo ‘column1’ y pasándolo a parallelize_dataframe(). También estamos pasando una nueva función llamada process_column1() que toma una serie como entrada, aplica my_func() en ‘column1’ y devuelve una nueva serie con el mismo índice. Esta función se ejecutará en paralelo en diferentes partes del dataframe utilizando pool.map().

    El dataframe resultante tendrá la misma forma que el original, con solo los valores de ‘column1’ modificados por my_func(). Si necesitas aplicar my_func() en otras columnas también, puedes modificar process_column1() en consecuencia.

    Ten en cuenta que pool.map() espera una función que tome un único parámetro, por lo que estamos pasando una serie en lugar de un dataframe a process_column1().

Comments are closed.