¿Cómo puedo enviar otro argumento a través de la función ejecutor.map? Vea un ejemplo de código:

from concurrent.futures import ProcessPoolExecutor
from dask.dataframe import read_csv


def apply(row_of_small_df):
    # Here there is no access to big_df
    return


def main():
    small_df = read_csv('...')
    big_df = read_csv('...')
    with ProcessPoolExecutor() as executor:
        results = executor.map(apply, small_df.iterrows())
        for result in results:
            pass


if __name__ == '__main__':
    main()
0
Hazan 24 jun. 2020 a las 12:11

3 respuestas

La mejor respuesta

Otra alternativa es usar functools.partial:

Devuelve un nuevo objeto parcial que cuando se llama se comportará como func llamado con los argumentos posicionales args y las palabras clave argumentos de palabras clave. Si se proporcionan más argumentos a la llamada, se agregan a los argumentos. Si se proporcionan argumentos de palabras clave adicionales, amplían y anulan las palabras clave.

from functools import partial

def apply(big_df, row_of_small_df):
    # requires big_df to be passed in
    return

def main():
    small_df = read_csv('...')
    big_df = read_csv('...')

    apply_with_big_df = partial(apply, big_df)

    with ProcessPoolExecutor() as executor:
        results = executor.map(apply_with_big_df, small_df.iterrows())
        for result in results:
            pass
1
Sebastian Loehner 24 jun. 2020 a las 09:39

Usa una lambda:

#...
def apply(big_df, row_of_small_df):
    pass
#...
results = executor.map(lambda row_of_small: apply(big_df, row_of_small), small_df.iterrows())
#...
0
Sadap 24 jun. 2020 a las 09:23

Usa la función zip de esta manera

results = executor.map(apply, zip(big_df.iterrows(), small_df.iterrows()))

La función ahora debería ser

def apply(params):
    big, small = params
    # your code
0
Eeshaan 24 jun. 2020 a las 09:33