Python 在达斯克,分销是如何运作的?

Python 在达斯克,分销是如何运作的?,python,pandas,numpy,dask,dask-distributed,Python,Pandas,Numpy,Dask,Dask Distributed,我有一个数据帧: import numpy as np import pandas as pd import dask.dataframe as dd a = {'b':['cat','bat','cat','cat','bat','No Data','bat','No Data'], 'c':['str1','str2','str3', 'str4','str5','str6','str7', 'str8'] } df11 = pd.DataFrame(a,index=['x

我有一个数据帧:

import numpy as np
import pandas as pd
import dask.dataframe as dd
a = {'b':['cat','bat','cat','cat','bat','No Data','bat','No Data'],
     'c':['str1','str2','str3', 'str4','str5','str6','str7', 'str8']
    }
df11 = pd.DataFrame(a,index=['x1','x2','x3','x4','x5','x6','x7','x8'])
我尝试使用lamda函数在行和正常数据帧上提取每个元素,如下所示:

def elementsearch(term1, term2):
    print(term1, term2 )
    return term1

df11.apply(lambda x: elementsearch(x.b,x.c), axis =1)
这很好用。但当我使用dask库时:

ddf = dd.from_pandas(df11,npartitions=8)
ddf.map_partitions(lambda df : df.apply(lambda x : elementsearch((x.b,x.c),axis=1)))
它抛出了如下错误:

ValueError: Metadata inference failed in `lambda`.

You have supplied a custom function and Dask is unable to 
determine the type of output that that function returns. 

To resolve this please provide a meta= keyword.
The docstring of the Dask function you ran should have more information.

Original error is below:
------------------------
AttributeError("'Series' object has no attribute 'c'", 'occurred at index b')

Traceback:
---------
  File "/opt/conda/lib/python3.6/site-packages/dask/dataframe/utils.py", line 137, in raise_on_meta_error
    yield
  File "/opt/conda/lib/python3.6/site-packages/dask/dataframe/core.py", line 3477, in _emulate
    return func(*_extract_meta(args, True), **_extract_meta(kwargs, True))
  File "<ipython-input-198-8857a48ba1e5>", line 2, in <lambda>
    ddf.map_partitions(lambda df : df.apply(lambda x : elementsearch((x.b,x.c),axis=1)))
  File "/opt/conda/lib/python3.6/site-packages/pandas/core/frame.py", line 6014, in apply
    return op.get_result()
  File "/opt/conda/lib/python3.6/site-packages/pandas/core/apply.py", line 318, in get_result
    return super(FrameRowApply, self).get_result()
  File "/opt/conda/lib/python3.6/site-packages/pandas/core/apply.py", line 142, in get_result
    return self.apply_standard()
  File "/opt/conda/lib/python3.6/site-packages/pandas/core/apply.py", line 248, in apply_standard
    self.apply_series_generator()
  File "/opt/conda/lib/python3.6/site-packages/pandas/core/apply.py", line 277, in apply_series_generator
    results[i] = self.f(v)
  File "<ipython-input-198-8857a48ba1e5>", line 2, in <lambda>
    ddf.map_partitions(lambda df : df.apply(lambda x : elementsearch((x.b,x.c),axis=1)))
  File "/opt/conda/lib/python3.6/site-packages/pandas/core/generic.py", line 4376, in __getattr__
    return object.__getattribute__(self, name)
ValueError:元数据推断在“lambda”中失败。
您提供了自定义函数,Dask无法
确定该函数返回的输出类型。
要解决此问题,请提供meta=关键字。
运行的Dask函数的docstring应该包含更多信息。
原始错误如下:
------------------------
AttributeError(“'Series'对象没有属性'c','发生在索引b')
回溯:
---------
文件“/opt/conda/lib/python3.6/site packages/dask/dataframe/utils.py”,第137行,在raise\u on\u meta\u错误中
产量
文件“/opt/conda/lib/python3.6/site packages/dask/dataframe/core.py”,第3477行,在模拟中
return func(*_extract_meta(args,True),**_extract_meta(kwargs,True))
文件“”,第2行,在
映射分区(lambda-df:df.apply(lambda-x:elementsearch((x.b,x.c),axis=1)))
文件“/opt/conda/lib/python3.6/site packages/pandas/core/frame.py”,第6014行,适用于
返回操作获取结果()
文件“/opt/conda/lib/python3.6/site packages/pandas/core/apply.py”,第318行,在get_结果中
返回super(FrameRowApply,self).get_result()
文件“/opt/conda/lib/python3.6/site packages/pandas/core/apply.py”,第142行,在get_结果中
返回self.apply_标准()
文件“/opt/conda/lib/python3.6/site packages/pandas/core/apply.py”,第248行,应用标准
自应用_系列_生成器()
文件“/opt/conda/lib/python3.6/site packages/pandas/core/apply.py”,第277行,在apply_series_生成器中
结果[i]=self.f(v)
文件“”,第2行,在
映射分区(lambda-df:df.apply(lambda-x:elementsearch((x.b,x.c),axis=1)))
文件“/opt/conda/lib/python3.6/site packages/pandas/core/generic.py”,第4376行,位于__
返回对象。\uuuGetAttribute(self,name)
我在stack Overflow中提到了这个问题,但它对我不起作用:


如何解决此问题?

我建议只在dask数据帧上使用apply方法,就像您在Pandas代码中所做的那样

df11.apply(lambda x: elementsearch(x.b,x.c), axis =1)