pandas groupby 对象上的 dask 延迟函数

dask delayed functions on pandas groupby objects

我不知道如何计算来自 df.groupy.apply() 操作的延迟对象。如果有人可以提供帮助,我真的很感激。这是我写的示例代码

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')

tmp_grp的输出是

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

我不知道如何从中调用延迟对象并计算它们。

在此先感谢您。

使用 delayed 时,最好显式构造延迟值列表,在您的上下文中,这将是:

delayeds=[dask_test(group, 'val1') for _, group in df.groupby(['id', 'id2'])]

然后,可以使用dask.compute(*delayeds)计算延迟值。

由于您使用的是 pandas,您可以考虑使用 Dask DataFrame 而不是 Delayed,这样优化得更好。 :)

类似于:

import dask.dataframe as dd

ddf = dd.from_pandas(df, npartitions=4)

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 = ddf.groupby(['id','id2']).apply(dask_test,'val1')
tmp_grp.compute().sort_index()

请注意,当您使用 Dask DataFrame 时,您不需要在 dask_test 函数中使用 for 循环。另请参阅:https://docs.dask.org/en/latest/dataframe-groupby.html#difficult-cases 了解优化提示