安全&修改dask数据帧的高效方法

时间:2017-09-05 10:24:39

标签: dask dask-distributed

作为数据工作流程的一部分,我需要修改dask数据帧列子集中的值,并将结果传递给进一步计算。特别是,我对两种情况感兴趣:映射列和映射分区。什么是推荐的安全&以高效的方式对数据采取行动?我在每个主机上有多个工作进程的群集上运行分布式设置

案例1

我想跑:

res = dataframe.column.map(func, ...)

这将返回一个数据系列,因此我假设未修改原始数据帧。将列分配回数据帧是否安全,例如dataframe['column']=res?可能不是。我应该使用 .copy()制作副本,然后将结果分配给它:

dataframe2 = dataframe.copy()
dataframe2['column'] = dataframe.column.map(func, ...)

还有其他推荐方法吗?

案例2

我需要映射数据帧的分区:

df.map_partitions(mapping_func, meta=df)

mapping_func()中,我想修改所选列中的值,方法是使用partition[column].map或仅创建列表推导。再次,如何安全地修改分区并从映射函数返回它?

映射函数接收的分区是Pandas数据帧(原始数据的副本?)但是在就地修改数据时我看到了一些崩溃(尽管没有异常/错误消息)。调用partition.copy(deep=False)也是如此,它不起作用。应该对分区进行深度复制,然后进行就地修改吗?或者我应该总是用新的/映射的列数据和原始/未修改的系列/列构建新的数据帧?

1 个答案:

答案 0 :(得分:2)

您可以安全地修改dask.dataframe

支持以下操作并且安全

df['col'] = df['col'].map(func)

这会修改任务图,但不会修改数据(假设函数func创建了一个新系列)。

您无法安全地修改分区

当你map_partitions修改pandas数据帧的函数时你的第二种情况是不安全的。 Dask期望能够重用数据,必要时调用函数两次等。如果你有这样的函数,那么你应该首先在该函数中创建一个Pandas数据帧的副本。