首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Dask映射分区时,解压函数内部的元组

使用Dask映射分区时,解压函数内部的元组
EN

Stack Overflow用户
提问于 2021-02-24 07:20:52
回答 1查看 227关注 0票数 1

我尝试在Dask数据帧的多个分区上运行一个函数。该代码需要解压元组,并且可以很好地与Pandas一起工作,但不能与Dask map_partitions一起工作。数据对应于元组列表,其中列表的长度可以变化,但元组始终具有已知的固定长度。

代码语言:javascript
运行
复制
import dask.dataframe as dd
import pandas as pd

def func(df):
    for index, row in df.iterrows():
        tuples = row['A']
        for t in tuples:
            x, y = t
          # Do more stuff

# Create Pandas dataframe
# Each list may have a different length, tuples have fixed known length
df = pd.DataFrame({'A': [[(1, 1), (3, 4)], [(3, 2)]]})
# Pandas to Dask
ddf = dd.from_pandas(df, npartitions=2)

# Run function over Pandas dataframe
func(df)
# Run function over Dask dataframe
ddf.map_partitions(func).compute()

在这里,Pandas版本运行没有任何问题。然而,Dask one引发了错误:

代码语言:javascript
运行
复制
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不能解决这个问题。如何解压元组?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-24 12:48:58

当您在没有指定meta的情况下使用dask时,dask将尝试运行函数来推断输出。如果您的函数与使用的示例数据帧不兼容,这可能会导致问题,您可以使用ddf._meta_nonempty查看此示例数据帧(在本例中,它将返回一列foo)。

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

代码语言:javascript
运行
复制
import dask.dataframe as dd
import pandas as pd

def func(df):
    for index, row in df.iterrows():
        tuples = row['A']
        for t in tuples:
            x, y = t
    return [1,2,3]

df = pd.DataFrame({'A': [[(1, 1), (3, 4)], [(3, 2)]]})
ddf = dd.from_pandas(df, npartitions=2)
ddf.map_partitions(func, meta=list).compute()

另一种方法是使您的函数与所使用的示例数据帧兼容。示例数据帧具有对象列,但它包含foo而不是元组列表,因此无法将其解包为元组。修改您的函数以接受非元组列(使用x, *y = t)将使其正常工作:

代码语言:javascript
运行
复制
import dask.dataframe as dd
import pandas as pd

def func(df):
    for index, row in df.iterrows():
        tuples = row['A']
        for t in tuples:
            x, *y = t
    return [1,2,3]

df = pd.DataFrame({'A': [[(1, 1), (3, 4)], [(3, 2)]]})
ddf = dd.from_pandas(df, npartitions=2)
#notice that no meta is specified here
ddf.map_partitions(func).compute()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66342506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档