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