dask.DataFrame.apply 和可变长度数据

dask.DataFrame.apply and variable length data

我想将一个函数应用于 dask.DataFrame,returns 一个可变长度的系列。举例说明:

def generate_varibale_length_series(x):
    '''returns pd.Series with variable length'''
    n_columns = np.random.randint(100)
    return pd.Series(np.random.randn(n_columns))

#apply this function to a dask.DataFrame
pdf = pd.DataFrame(dict(A=[1,2,3,4,5,6]))
ddf = dd.from_pandas(pdf, npartitions = 3)
result = ddf.apply(generate_varibale_length_series, axis = 1).compute()

显然,这工作正常。

关于这个,我有两个问题:

背景/用例:在我的数据框中,每一行代表一个模拟轨迹。我要应用的功能从中提取某些事件的时间点。由于我事先不知道每条轨迹的事件数,因此我不知道生成的数据框会有多少列。

编辑: 正如 MRocklin 所建议的,这里有一种使用 dask delayed 来计算 result:

的方法
#convert ddf to delayed objects
ddf_delayed = ddf.to_delayed()
#delayed version of pd.DataFrame.apply
delayed_apply = dask.delayed(lambda x: x.apply(generate_varibale_length_series, axis = 1))
#use this function on every delayed object
apply_on_every_partition_delayed = [delayed_apply(d) for d in ddf.to_delayed()]
#calculate the result. This gives a list of pd.DataFrame objects
result = dask.compute(*apply_on_every_partition_delayed)
#concatenate them
result = pd.concat(result)

简答

不,dask.dataframe不支持这个

长答案

Dask.dataframe 期望提前知道每个分区的列,并且期望这些列匹配。

不过,您仍然可以通过 dask.delayed 将 Dask 和 Pandas 一起使用,这样处理此类问题的能力要强得多。

http://dask.pydata.org/en/latest/delayed.html