当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python dask.dataframe.DataFrame.map_partitions用法及代码示例


用法:

DataFrame.map_partitions(func, *args, **kwargs)

在每个 DataFrame 分区上应用 Python 函数。

请注意,假设索引和部门保持不变。

参数

func函数

应用于每个分区的函数。

args, kwargs

要传递给函数的参数和关键字。分区将是第一个参数,这些将被传递.参数和关键字可能包含Scalar,Delayed,partition_info或常规的 python 对象。 DataFrame-like args(dask 和 pandas)将在应用函数之前重新分区以对齐(如有必要)(请参阅align_dataframes控制)。

enforce_metadata布尔值,默认为真

是否在运行时强制 func 生成的 DataFrame 的结构实际上与 meta 的结构匹配。这将为每个分区重命名和重新排序列,如果这不起作用或类型不匹配,则会引发错误。

transform_divisions布尔值,默认为真

是否将函数应用于分区并将这些转换的分区应用于输出。

align_dataframes布尔值,默认为真

是否重新分区 DataFrame- 或 Series-like args(dask 和 pandas),以便在应用函数之前它们的分区对齐。这要求所有输入都具有已知的除法。 Single-partition 输入将被分成多个分区。

如果为 False,则所有输入必须具有相同数量的分区或单个分区。 Single-partition 输入将被广播到 multi-partition 输入的每个分区。

metapd.DataFrame、pd.Series、dict、可迭代、元组、可选

与输出的 dtypes 和列名匹配的空 pd.DataFramepd.Series。此元数据对于 dask 数据帧中的许多算法起作用是必需的。为了便于使用,还提供了一些替代输入。可以提供 {name: dtype}dict(name, dtype) 的可迭代对象,而不是 DataFrame (请注意,名称的顺序应与列的顺序匹配)。可以使用(name, dtype) 的元组代替系列。如果未提供,dask 将尝试推断元数据。这可能会导致意外结果,因此建议提供meta。有关详细信息,请参阅 dask.dataframe.utils.make_meta

例子

给定一个 DataFrame、Series 或 Index,例如:

>>> import pandas as pd
>>> import dask.dataframe as dd
>>> df = pd.DataFrame({'x': [1, 2, 3, 4, 5],
...                    'y': [1., 2., 3., 4., 5.]})
>>> ddf = dd.from_pandas(df, npartitions=2)

可以使用map_partitions 在每个分区上应用一个函数。可以选择提供额外的参数和关键字,并将在分区后传递给函数。

在这里,我们将带有参数和关键字的函数应用于 DataFrame,从而产生一个系列:

>>> def myadd(df, a, b=1):
...     return df.x + df.y + a + b
>>> res = ddf.map_partitions(myadd, 1, b=2)
>>> res.dtype
dtype('float64')

默认情况下,dask 尝试通过在一些假数据上运行您提供的函数来推断输出元数据。这在许多情况下效果很好,但有时可能很昂贵,甚至失败。为避免这种情况,您可以使用 meta 关键字手动指定输出元数据。这可以以多种形式指定,有关详细信息,请参阅dask.dataframe.utils.make_meta

在这里,我们指定输出是一个没有名称的系列,并且 dtype float64

>>> res = ddf.map_partitions(myadd, 1, b=2, meta=(None, 'f8'))

这里我们映射一个函数,该函数接受一个 DataFrame,并返回一个带有新列的 DataFrame:

>>> res = ddf.map_partitions(lambda df: df.assign(z=df.x * df.y))
>>> res.dtypes
x      int64
y    float64
z    float64
dtype: object

和以前一样,也可以手动指定输出元数据。这次我们传入一个 dict ,因为输出是一个 DataFrame:

>>> res = ddf.map_partitions(lambda df: df.assign(z=df.x * df.y),
...                          meta={'x': 'i8', 'y': 'f8', 'z': 'f8'})

在元数据不变的情况下,也可以直接传入对象本身:

>>> res = ddf.map_partitions(lambda df: df.head(), meta=ddf)

另请注意,假设索引和部门保持不变。如果你映射的函数改变了索引/分区,你需要在之后清除它们:

>>> ddf.map_partitions(func).clear_divisions()

您的 map 函数通过接受特殊的 partition_info 关键字参数来获取有关它在 DataFrame 中的位置的信息。

>>> def func(partition, partition_info=None):
...     pass

这将收到以下信息:

>>> partition_info  
{'number': 1, 'division': 3}

对于每个作为 dask 数据帧的参数和关键字参数,您将收到代表数据帧的第 n 个分区和分区(分区中的第一个索引值)的数字 (n)。如果不知道分区(例如,如果索引未排序),那么您将得到 None 作为分区。

相关用法


注:本文由纯净天空筛选整理自dask.org大神的英文原创作品 dask.dataframe.DataFrame.map_partitions。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。