Dataframe 循环内的DASK数据帧
我在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上完成任务需要
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)
这将在一次过程中计算所有内容