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

时间:2016-12-13 23:46:37

标签: python dask

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

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

显然,这很好用。

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

  • 这应该是永远的,还是我在这里很幸运? dask是否期望所有分区具有相同数量的列?
  • 如果元数据推断失败,如果事先不知道列数,我该如何提供元数据呢?

背景/用例:在我的数据框中,每行代表一个模拟轨迹。我想要应用的函数从中提取某些事件的时间点。由于我事先并不知道每条路径的事件数,因此我不知道结果数据帧将包含多少列。

编辑: 正如MRocklin建议的那样,这里使用dask延迟计算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)

1 个答案:

答案 0 :(得分:1)

简短回答

不,dask.dataframe不支持此

答案很长

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

但是,你仍然可以通过dask.delayed一起使用Dask和Pandas,它更能处理这些问题。

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