用法:
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 输入的每个分区。
- meta:pd.DataFrame、pd.Series、dict、可迭代、元组、可选
与输出的 dtypes 和列名匹配的空
pd.DataFrame
或pd.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 作为分区。
相关用法
- Python dask.dataframe.DataFrame.max用法及代码示例
- Python dask.dataframe.DataFrame.mask用法及代码示例
- Python dask.dataframe.DataFrame.mod用法及代码示例
- Python dask.dataframe.DataFrame.memory_usage用法及代码示例
- Python dask.dataframe.DataFrame.mul用法及代码示例
- Python dask.dataframe.DataFrame.mode用法及代码示例
- Python dask.dataframe.DataFrame.min用法及代码示例
- Python dask.dataframe.DataFrame.applymap用法及代码示例
- Python dask.dataframe.DataFrame.sub用法及代码示例
- Python dask.dataframe.DataFrame.cummin用法及代码示例
- Python dask.dataframe.DataFrame.truediv用法及代码示例
- Python dask.dataframe.DataFrame.round用法及代码示例
- Python dask.dataframe.DataFrame.ne用法及代码示例
- Python dask.dataframe.DataFrame.partitions用法及代码示例
- Python dask.dataframe.DataFrame.to_bag用法及代码示例
- Python dask.dataframe.DataFrame.any用法及代码示例
- Python dask.dataframe.DataFrame.itertuples用法及代码示例
- Python dask.dataframe.DataFrame.count用法及代码示例
- Python dask.dataframe.DataFrame.describe用法及代码示例
- Python dask.dataframe.DataFrame.to_parquet用法及代码示例
注:本文由纯净天空筛选整理自dask.org大神的英文原创作品 dask.dataframe.DataFrame.map_partitions。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。