我想将函数应用于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()
显然,这很好用。
关于这一点,我有两个问题:
背景/用例:在我的数据框中,每行代表一个模拟轨迹。我想要应用的函数从中提取某些事件的时间点。由于我事先并不知道每条路径的事件数,因此我不知道结果数据帧将包含多少列。
编辑:
正如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)
答案 0 :(得分:1)
不,dask.dataframe不支持此
Dask.dataframe希望提前知道每个分区的列,并期望这些列匹配。
但是,你仍然可以通过dask.delayed一起使用Dask和Pandas,它更能处理这些问题。