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()
显然,这工作正常。
关于这个,我有两个问题:
- 这应该一直有效还是我在这里很幸运? dask 是否期望所有分区都具有相同数量的列?
- 万一元数据推断失败,如果事先不知道列数,我如何提供元数据?
背景/用例:在我的数据框中,每一行代表一个模拟轨迹。我要应用的功能从中提取某些事件的时间点。由于我事先不知道每条轨迹的事件数,因此我不知道生成的数据框会有多少列。
编辑:
正如 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 一起使用,这样处理此类问题的能力要强得多。
我想将一个函数应用于 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()
显然,这工作正常。
关于这个,我有两个问题:
- 这应该一直有效还是我在这里很幸运? dask 是否期望所有分区都具有相同数量的列?
- 万一元数据推断失败,如果事先不知道列数,我如何提供元数据?
背景/用例:在我的数据框中,每一行代表一个模拟轨迹。我要应用的功能从中提取某些事件的时间点。由于我事先不知道每条轨迹的事件数,因此我不知道生成的数据框会有多少列。
编辑:
正如 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 一起使用,这样处理此类问题的能力要强得多。