Dataframe 循环内的DASK数据帧

Dataframe 循环内的DASK数据帧,dataframe,dask,Dataframe,Dask,我在Dask中实现循环时遇到了一些问题。 例如,在以下代码中: for i in range(len(col)): if df[col[i]].dtype=='object': pass elif df[col[i]].std().compute()==0: cols_constant.append(col[i]) df = df.drop(cols_constant,axis=1) 同样的代码使用pandas非常快,但是在dask上完成任务需要

我在Dask中实现循环时遇到了一些问题。 例如,在以下代码中:

for i in range(len(col)):
    if df[col[i]].dtype=='object':
        pass
    elif df[col[i]].std().compute()==0:
        cols_constant.append(col[i])
df = df.drop(cols_constant,axis=1)
同样的代码使用pandas非常快,但是在dask上完成任务需要相当长的时间

我知道Dask在循环中效率很低。 但是,如何优化Dask的代码,使其具有类似于上述函数的功能

我不能使用e.persist(),因为我们打算在多个辅助系统上进行计算


使用函数“dask.do”并行处理同一任务是否有用?

每次调用
df.column.std.compute()
时,您不仅要承担调用
std()
的成本,还要承担创建
df
的成本。如果您从pandas数据帧创建
df
,那么这是便宜的,但是如果您从一些更昂贵的过程创建
df
,比如从CSV文件读取,那么这可能非常昂贵

df = dd.from_pandas()  # ok to call compute many times, data is already in memory
df = dd.read_csv(...)  # slow to call compute many times, we read the all the csv files every time you call compute
如果您有内存,那么可以通过调用persist来避免重复的开销

df = df.persist()
在您的问题中,您说您不能使用persist,因为您计划在多工作系统上执行此操作。需要说明的是,如果您有可用内存,persist在所有情况下都可以工作,包括单工作进程和多工作进程

您还可以通过只调用一次compute来避免重复调用compute

stds = [df[column].std() for column in df.columns]
stds = dask.compute(stds)
这将在一次过程中计算所有内容