Python 使用Dask映射分区时在函数内解包元组

Python 使用Dask映射分区时在函数内解包元组,python,pandas,dask,Python,Pandas,Dask,我试图在Dask数据帧的多个分区上运行一个函数。该代码需要解包元组,可以很好地处理Pandas,但不能处理Daskmap\u分区。数据对应于元组列表,其中列表的长度可能不同,但元组始终具有已知的固定长度 导入dask.dataframe作为dd 作为pd进口熊猫 def func(df): 对于索引,df.iterrows()中的行: 元组=行['A'] 对于元组中的t: x、 y=t #多做事 #创建数据帧 #每个列表可能有不同的长度,元组有固定的已知长度 df=pd.DataFrame({'

我试图在Dask数据帧的多个分区上运行一个函数。该代码需要解包元组,可以很好地处理Pandas,但不能处理Dask
map\u分区
。数据对应于元组列表,其中列表的长度可能不同,但元组始终具有已知的固定长度

导入dask.dataframe作为dd
作为pd进口熊猫
def func(df):
对于索引,df.iterrows()中的行:
元组=行['A']
对于元组中的t:
x、 y=t
#多做事
#创建数据帧
#每个列表可能有不同的长度,元组有固定的已知长度
df=pd.DataFrame({'A':[[(1,1)、(3,4)],[(3,2)]})
#熊猫去达斯克
ddf=dd.from_熊猫(df,npartitions=2)
#在数据帧上运行函数
func(df)
#在Dask数据帧上运行函数
map_分区(func.compute())
在这里,Pandas版本运行时没有问题。但是,Dask one会引发错误:

ValueError: Metadata inference failed in `func`.

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:
------------------------
ValueError('not enough values to unpack (expected 2, got 1)')

在我的原始函数中,我使用这些元组作为辅助变量,最终返回的数据完全不同,因此使用
meta
无法解决问题。如何解压元组?

当您使用
映射分区
而不指定
meta
时,dask将尝试运行函数来推断输出是什么。如果您的函数与使用的示例数据帧不兼容,则可能会导致问题。您可以使用
ddf.\u meta\u nonempty
(在这种情况下,它将返回一列
foo

在这种情况下,一个简单的解决方法是提供
meta
,返回的数据可以采用不同的格式,例如,如果每个返回的结果都是一个列表,则可以提供
meta=list

导入dask.dataframe作为dd
作为pd进口熊猫
def func(df):
对于索引,df.iterrows()中的行:
元组=行['A']
对于元组中的t:
x、 y=t
返回[1,2,3]
df=pd.DataFrame({'A':[[(1,1)、(3,4)],[(3,2)]})
ddf=dd.from_熊猫(df,npartitions=2)
map_分区(func,meta=list).compute()
另一种方法是使函数与所使用的示例数据帧兼容。示例数据帧有一个对象列,但它包含
foo
,而不是元组列表,因此不能将其解包为元组。修改函数以接受非元组列(使用
x,*y=t
)将使其工作:

导入dask.dataframe作为dd
作为pd进口熊猫
def func(df):
对于索引,df.iterrows()中的行:
元组=行['A']
对于元组中的t:
x、 *y=t
返回[1,2,3]
df=pd.DataFrame({'A':[[(1,1)、(3,4)],[(3,2)]})
ddf=dd.from_熊猫(df,npartitions=2)
#注意,这里没有指定meta
map_分区(func.compute())