如何在 Dask Series.apply 中指定参数 "meta"?

How to specify parameter "meta" in Dask Series.apply?

我有一个函数 features_extract,它将一个字符串 r 作为输入,returns 一个列表 [r, 3, 6]。我想将此功能应用于系列 s。然后它 returns 一个错误 AttributeError: 'DataFrame' object has no attribute 'name'.

你能解释一下我错在哪里吗?

from dask.distributed import Client
import dask.dataframe as dd
import pandas as pd
import numpy as np
client = Client()

s = pd.Series(['a', 'b', 'c'])

def features_extract(r):
    return [r, 6, 7]

meta = [(0, 'f8'), (1, np.int64), (2, np.int64)]

s = dd.from_pandas(s, npartitions = 5)
s = s.apply(features_extract, meta = meta)
s.compute(scheduler = 'processes')

meta 选项中,您传递的是函数返回的对象的属性,但函数 features_extract 返回的项目是列表,而不是 pandas 系列.有两种方法可以解决此问题:

  1. meta 选项更改为 list(dask 不会关心列表中的数据类型):
s = dd.from_pandas(s, npartitions = 5)
s = s.apply(features_extract, meta = list)
s.compute(scheduler = 'processes')
  1. 将函数输出更改为 pandas 系列,然后 dask 将使用您指定的数据类型:
def features_extract(r):
    return pd.Series([r, 6, 7])

meta = [(0, 'f8'), (1, np.int64), (2, np.int64)]

s = dd.from_pandas(s, npartitions = 5)
s = s.apply(features_extract, meta = meta)
s.compute(scheduler = 'processes')

有关详细信息,请参阅 docs