Python Dask - dataframe.map_partitions() return 值

Python Dask - dataframe.map_partitions() return value

所以 dask.dataframe.map_partitions() 需要一个 func 参数和 meta kwarg。它究竟是如何决定其 return 类型的?例如:

...\some_folder 中有很多 csv。

ddf = dd.read_csv(r"...\some_folder\*", usecols=['ColA', 'ColB'], 
                                        blocksize=None, 
                                        dtype={'ColA': np.float32, 'ColB': np.float32})
example_func = lambda x: x.iloc[-1] / len(x)
metaResult = pd.Series({'ColA': .1234, 'ColB': .1234})
result = ddf.map_partitions(example_func, meta=metaResult).compute()

我对 "distributed" 计算很陌生,但我直觉上希望这是 return Series 对象的集合(很可能是列表或字典),但结果是可以将每个分区上的 example_func 结果串联起来的系列对象。如果这个系列有一个 MultiIndex 来指示分区标签,这本身就足够了。

据我从 , the docs, and the source code itself 可以看出,这是因为 ddf.divisions 将 return 作为读取 csv 的结果 (None, None, ..., None)?是否有一种 dask-native 方法可以做到这一点,或者我是否需要手动进入并打破 returned 系列(returned 由 example_func 在每个分区)我自己?

此外,请随时在这里更正我的 assumptions/practices,因为我是 dask 新手。

So dask.dataframe.map_partitions() takes a func argument and the meta kwarg. How exactly does it decide its return type?

map_partition 尝试以 'intelligent' 的方式将 func 编辑的结果 return 连接到 dask DataFrame 或 dask Series 对象。此决定基于 func 的 return 值:

  • 如果 func return 是一个标量,map_partitions return 是一个 dask Series 对象。
  • 如果func return是一个pd.Series对象,map_partition return是一个dask Series对象,其中所有pd.Series对象return由 func 拼接而成。
  • 如果func return是一个pd.DataFrame,map_partitions return是一个dask Dataframe对象,其中这些pd.DataFrame对象被连接在一起第一个轴。

如果您对特殊分区的结果感兴趣,可以使用get_partition()。如果分区标签通常对您来说是重要信息,我会考虑在从 csv 读取数据后直接分配一个单独的 ddf 列,其中包含您需要的所有信息。之后,您可以以某种方式构造 func,它 return 是一个 pd.DataFrame,其中一列包含计算结果,另一列包含识别结果所需的信息。