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.

funciones retardadas de Dask en objetos groupby de pandas

No pude averiguar cómo calcular objetos retrasados que provienen de la operación df.groupby.apply(). Realmente agradezco si alguien puede ayudar. Aquí hay un código de muestra que escribí:

import pandas as pd
import dask
df = pd.DataFrame(columns=['id','id2','val1'])
df['id'] = ['A','A','A','B','C','C','D','D']
df['id2']=['a','a','b','a','a','b','b','b']
df['val1']= [1,2,3,4,5,6,7,8]
@dask.delayed
def dask_test(group,val_col):
    for idx,row in group.iterrows():
        group.loc[idx,'test']=2*group.loc[idx,val_col]
    return group

tmp_grp = df.groupby(['id','id2']).apply(dask_test,'val1')

La salida de tmp_grp es:

id  id2
A   a      Delayed('copy-f0e26845-fc3a-4bb7-8609-47b923c0...
    b      Delayed('copy-9b6cecf5-9fa4-4301-ba2d-dec5478d...
B   a      Delayed('copy-7b538f4b-ac3f-4c83-b37b-e620d0ba...
C   a      Delayed('copy-c722fa78-c46e-422a-88a5-b9e48cac...
    b      Delayed('copy-01454a03-fd28-4fa5-b487-563ccc66...
D   b      Delayed('copy-f6cf94bd-d457-4495-bb2e-1db0152c...
dtype: object

No sé cómo llamar a objetos retrasados a partir de esto y calcularlos.

Muchas gracias de antemano.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para calcular los objetos retrasados provenientes de la operación df.groupby.apply(), se puede utilizar la función dask.compute(), la cual toma una lista de objetos retrasados y devuelve los valores calculados. En tu caso, puedes hacer lo siguiente:

    # Llamar a dask.compute() sobre el objeto tmp_grp
    result = dask.compute(tmp_grp)
    
    # El resultado será una tupla que contiene una lista de valores calculados
    # En este caso, solo hay un valor que es un DataFrame de pandas
    computed_df = result[0]
    
    # Ahora puedes acceder a la columna 'test' que fue agregada por la función dask_test
    print(computed_df['test'])
    
    # Salida:
    # 0     2
    # 1     4
    # 2     6
    # 3     8
    # 4    10
    # 5    12
    # 6    14
    # 7    16
    # Name: test, dtype: int64
    

    Ten en cuenta que dask.compute() es una operación de bloqueo que calcula los objetos retrasados, por lo que puede llevar algún tiempo dependiendo del tamaño de los datos y la complejidad del cálculo.

Comments are closed.