evi*_*rex 5 dask dask-distributed
作为数据工作流的一部分,我需要修改 dask 数据框列子集中的值并传递结果以进行进一步计算。特别是,我对两种情况感兴趣:映射列和映射分区。对数据采取行动的推荐安全且高效的方式是什么?我在每个主机上有多个工作进程的集群上运行分布式设置。
情况1。
我想跑:
res = dataframe.column.map(func, ...)
Run Code Online (Sandbox Code Playgroud)
这将返回一个数据系列,所以我假设原始数据帧没有被修改。将一列分配回数据框是否安全,例如dataframe['column']=res?可能不是。我应该使用.copy()制作一个副本,然后将结果分配给它,例如:
dataframe2 = dataframe.copy()
dataframe2['column'] = dataframe.column.map(func, ...)
Run Code Online (Sandbox Code Playgroud)
还有其他推荐的方法吗?
案例2
我需要映射数据帧的分区:
df.map_partitions(mapping_func, meta=df)
Run Code Online (Sandbox Code Playgroud)
在mapping_func() 中,我想通过使用partition[column].map或简单地创建列表理解来修改所选列中的值。同样,如何安全地修改分区并从映射函数中返回它?
映射函数收到的分区是 Pandas 数据帧(原始数据的副本?),但是在就地修改数据时,我看到了一些崩溃(尽管没有异常/错误消息)。调用也是一样partition.copy(deep=False),它不起作用。分区应该被深度复制然后就地修改吗?或者我应该总是从新的/映射的列数据和原始/未修改的系列/列中构建一个新的数据框?
支持以下操作并且安全
df['col'] = df['col'].map(func)
Run Code Online (Sandbox Code Playgroud)
这会就地修改任务图,但不会就地修改数据(假设该函数func创建一个新系列)。
当您map_partitions使用适当修改 pandas 数据框的函数时,第二种情况是不安全的。Dask 期望能够重用数据,必要时调用函数两次,等等。如果您有这样的函数,那么您应该首先在该函数中创建 Pandas 数据帧的副本。
| 归档时间: |
|
| 查看次数: |
903 次 |
| 最近记录: |