【问题标题】:Python Dask - dataframe.map_partitions() return valuePython Dask - dataframe.map_partitions() 返回值
【发布时间】:2016-11-17 18:57:05
【问题描述】:

所以dask.dataframe.map_partitions() 接受func 参数和meta kwarg。它究竟是如何决定它的返回类型的?举个例子:

...\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()

我对“分布式”计算还很陌生,但我直觉上希望这会返回 Series 对象的集合(很可能是列表或字典),但结果是一个可以被视为串联的 Series 对象每个分区上 example_func 的结果。如果这个系列有一个 MultiIndex 来指示分区标签,这本身就足够了。

this questiondocsthe source code itself 可以看出,这是因为ddf.divisions 将返回(None, None, ..., None) 作为读取csv 的结果?是否有一种 dask-native 方式来执行此操作,或者我是否需要自己手动进入并破坏返回的系列(example_func 在每个分区上返回的系列的串联)?

另外,请随时纠正我的假设/做法,因为我是新手。

【问题讨论】:

    标签: python pandas dask


    【解决方案1】:

    所以 dask.dataframe.map_partitions() 接受一个 func 参数和 meta 夸格它究竟是如何决定其返回类型的?

    map_partition 尝试以“智能”方式将func 返回的结果连接到 dask DataFrame 或 dask Series 对象。这个决定是基于func的返回值:

    • 如果 func 返回一个标量,map_partitions 返回一个 dask Series 对象。
    • 如果func 返回一个pd.Series 对象,map_partition 返回一个dask Series 对象,其中连接func 返回的所有pd.Series 对象。
    • 如果 func 返回一个 pd.DataFrame,map_partitions 返回一个 dask Dataframe 对象,其中这些 pd.DataFrame 对象沿第一个轴连接。

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

    【讨论】:

    • 一个指标列...呃!接受。
    • 好的,但是你如何告诉它使用 pandas.Series?它不会上课。符号是什么?它不在文档中。
    猜你喜欢
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    相关资源
    最近更新 更多