修改 dask 数据框的安全和高效的方法
Safe & performant way to modify dask dataframe
作为数据工作流的一部分,我需要修改 dask 数据框列子集中的值,并将结果传递给进一步计算。特别是,我对两种情况感兴趣:映射列和映射分区。推荐的安全和高效的数据处理方式是什么?我运行将它设置为一个集群上的分布式设置,每个主机上有多个工作进程。
案例1.
我想运行:
res = dataframe.column.map(func, ...)
这个 return 是一个数据系列,所以我假设原始数据框没有被修改。将列分配回数据框是否安全,例如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
或仅通过创建列表理解。同样,如何安全地修改分区并从映射函数 return 它?
映射函数接收到的分区是一个 Pandas 数据帧(原始数据的副本?)但是在就地修改数据时我看到了一些崩溃(虽然没有 exception/error 消息)。调用 partition.copy(deep=False)
也是如此,它不起作用。分区应该深拷贝然后就地修改吗?或者我应该总是用 new/mapped 列数据和 original/unmodified series/columns?
构造一个新的数据框
您可以安全地修改一个dask.dataframe
支持和安全的如下操作
df['col'] = df['col'].map(func)
这会修改任务图,但不会修改数据(假设函数 func
创建了一个新系列)。
您不能安全地修改分区
第二种情况,当你 map_partitions
一个修改 pandas 数据帧的函数是不安全的。 Dask 希望能够重用数据,必要时调用函数两次,等等。如果你有这样的函数,那么你应该首先在该函数中创建 Pandas 数据帧的副本。
作为数据工作流的一部分,我需要修改 dask 数据框列子集中的值,并将结果传递给进一步计算。特别是,我对两种情况感兴趣:映射列和映射分区。推荐的安全和高效的数据处理方式是什么?我运行将它设置为一个集群上的分布式设置,每个主机上有多个工作进程。
案例1.
我想运行:
res = dataframe.column.map(func, ...)
这个 return 是一个数据系列,所以我假设原始数据框没有被修改。将列分配回数据框是否安全,例如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
或仅通过创建列表理解。同样,如何安全地修改分区并从映射函数 return 它?
映射函数接收到的分区是一个 Pandas 数据帧(原始数据的副本?)但是在就地修改数据时我看到了一些崩溃(虽然没有 exception/error 消息)。调用 partition.copy(deep=False)
也是如此,它不起作用。分区应该深拷贝然后就地修改吗?或者我应该总是用 new/mapped 列数据和 original/unmodified series/columns?
您可以安全地修改一个dask.dataframe
支持和安全的如下操作
df['col'] = df['col'].map(func)
这会修改任务图,但不会修改数据(假设函数 func
创建了一个新系列)。
您不能安全地修改分区
第二种情况,当你 map_partitions
一个修改 pandas 数据帧的函数是不安全的。 Dask 希望能够重用数据,必要时调用函数两次,等等。如果你有这样的函数,那么你应该首先在该函数中创建 Pandas 数据帧的副本。