【发布时间】:2021-01-21 17:06:50
【问题描述】:
我有一个使用某个 blocksize 的块创建的 dask 数据框:
df = dd.read_csv(filepath, blocksize = blocksize * 1024 * 1024)
我可以像这样分块处理它:
partial_results = []
for partition in df.partitions:
partial = trivial_func(partition[var])
partial_results.append(partial)
result = delayed(sum)(partial_results)
(这里我尝试使用map_partitions,但最终只使用了for 循环)。直到这部分一切正常。
现在,我需要对相同的数据运行一个函数,但是这个函数需要接收一定数量的数据帧(例如rows_per_chunk=60),这可以实现吗?有了熊猫,我会这样做:
partial_results = []
for i in range(int(len_df/rows_per_chunk)): # I think ceil would be better if decimal
arg_data = df.iloc[i*rows_per_chunk:(i+1)*rows_per_chunk]
partial = not_so_trivial_func(arg_data)
partial_results.append(partial)
result = sum(partial_results)
是否可以用 dask 做这样的事情?我知道由于延迟评估,无法使用iloc,但是否可以以不同的方式对数据帧进行分区?如果不是,那么使用 dask 实现这一目标的最有效方法是什么?数据框有数百万行。
【问题讨论】:
-
你需要这些块来表示连续的行吗? (这将发生在
pandas) -
是的,前n行属于某个组,需要与后n行分开处理,以此类推。