Python 按行块处理dask数据帧

Python 按行块处理dask数据帧,python,pandas,dask,Python,Pandas,Dask,我使用某个块大小的块创建了一个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

我使用某个
块大小的块创建了一个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\u分区
,但最终只使用了
for
循环)。在这部分之前,一切正常

现在,我需要在相同的数据上运行一个函数,但是这个函数需要接收数据帧中一定数量的行(例如,
rows\u per\u 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)

有可能用达斯克做这样的事吗?我知道,由于延迟计算,不可能使用
iloc
,但是可以用不同的方式对数据帧进行分区吗?如果没有,用dask实现这一目标的最有效方法是什么?数据帧有数百万行。

您可以沿着一个分区重新划分数据帧,该分区定义了如何在分区之间分配索引值(假设索引是唯一的)

导入dask.dataframe作为dd
作为pd进口熊猫
df=pd.DataFrame(范围(15),列=['x'])
ddf=dd.from_熊猫(df,npartitions=3)
#每个分区将有5行
打印(ddf.map\u分区(len.compute())
#您可以看到ddf是沿着这些索引值分割的
打印(ddf.分区)
#更改分区以具有所需的间距
新的分区=(0,3,6,9,12,14)
新分区=新分区。重新分区(分区=新分区)
#现在每个分区将有3行
打印(新的\u ddf.map\u分区(len.compute())
如果索引未知,则可以创建新索引(假设行不需要排序)并沿计算的分区重新分区:

导入dask.dataframe作为dd
作为pd进口熊猫
#将一些数据保存到未编制索引的csv中
行数=15
df=pd.DataFrame(范围(num_行),列=['x'])
df.to_csv('dask_test.csv',index=False)
#从csv读取
ddf=dd.read\u csv('dask\u test.csv',blocksize=10)
#假设行已经排序(因此不需要排序)
#然后可以使用分区的长度修改索引
cumlens=ddf.map_分区(len.compute().cumsum())
#由于处理将逐个分区进行,请保存它们
#个别地
新分区=[ddf.partitions[0]]
对于npart,枚举中的分区(ddf.partitions[1:].partitions):
partition.index=partition.index+cumlens[npart]
新的分区。追加(分区)
#这是我们的新ddf
ddf=dd.concat(新分区)
#根据累积长度设置分段
ddf.divisions=元组([0]+cumlens.tolist())
#更改分区以具有所需的间距
新分区大小=12
最大行数=cumlens.tolist()[-1]
新分区=列表(范围(0,最大行,新分区大小))

如果新的_分割[-1],是否需要这些块来表示连续的行?(这将发生在
pandas
)是的,前n行属于某个组,需要与下n行分开处理,依此类推。您好@SultanOrazbayev,我尝试了您的解决方案,您的代码工作正常,但不适用于我的情况。问题是,由于我拥有的数据量,我无法首先创建熊猫数据帧。我得到的
旧分区和新分区的左侧不同,因为
ddf。分区
返回一个只有
的元组。我明白了,您是从拼花地板还是csv加载的?看起来您的原始数据没有索引。我是从CSV加载的,事实上,我的数据没有索引。
dask
是否始终需要索引数据?某些操作需要索引,而不是所有操作都需要索引。请参阅更新的示例。我希望这能奏效。