當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。