我有一个非常大的数据帧(1.5亿行-30GB RAM)。我进行分组(大约40个分组),并在每个分组上应用一个函数。大约需要30分钟才能执行所有操作。这是我使用的代码:
df = df.groupby(by='date').apply(func=my_func)
由于操作不是相互依赖的,所以我认为我会使用Dask分别并行处理每个组的处理。
所以我使用以下代码:
from dask import dataframe as dd
df_dask = dd.from_pandas(df_pandas, npartitions=40)
template = pd.DataFrame(columns=['A','B','C','D','E'])
df_dask = df_dask.groupby(by='date').apply(func=my_func, meta=template)
df_dask = df_dask.compute()
但是,当我运行它时,我得到的结果取决于 npartitions 的值。如果我给定值1,它会给我相同(正确的结果),但它花费的时间与熊猫相同。如果给它更大的数字,它的执行速度会更快,但返回的行数会更少。我不了解npartition和groupby之间的关系。
此外,如果我尝试使用稍大一点的DataFrame(40GB),即使我的计算机上有64GB内存,Dask也会用尽内存。
有什么想法吗?
答案 0 :(得分:0)
Dask的DataFrameGroupBy.apply将用户提供的函数应用于每个分区:https://docs.dask.org/en/latest/dataframe-api.html#dask.dataframe.groupby.DataFrameGroupBy.apply。
如果需要自定义缩减,请使用Aggregate:https://docs.dask.org/en/latest/dataframe-groupby.html#aggregate