Dask apply:AttributeError:'DataFrame'对象没有'name'属性

9

我有一个参数数据框并对每一行应用一个函数。这个函数本质上是几个 SQL 查询和对结果进行简单计算。

我正在尝试利用Dask的多进程,同时保持结构和界面。下面的示例可以工作并且确实有显著的提升:

def get_metrics(row):

    record = {'areaName': row['name'],
              'areaType': row.area_type,
              'borough': row.Borough,
              'fullDate': row['start'],
              'yearMonth': row['start'],
              }


    Q = Qsi.format(unittypes=At,
                   start_date=row['start'],
                   end_date=row['end'],
                   freq='Q',
                   area_ids=row['descendent_ids'])

    sales = _get_DF(Q)
    record['salesInventory'] = len(sales)
    record['medianAskingPrice'] = sales.price.median()
    R.append(record)

R = []
x = ddf.map_partition(lambda x: x.apply(_metric, axis=1), meta={'result': None})
    x.compute()

result2 = pd.DataFrame(R)

然而,当我尝试使用.apply方法时(如下所示),它会抛出'DataFrame' object has no attribute 'name'的错误信息...
R = list()
y = ddf.apply(_metrics, axis=1, meta={'result': None})

然而,ddf.head() 显示数据框中有一个 name 列。


你写了 dask_DF.apply() 但是说 ddf 有一个名为 name 的列。尝试使用 ddf.apply() - Mike Müller
谢谢,但那只是(已解决的)拼写错误,我在这里尝试简化代码。它与问题无关。 - Philipp_Kats
被采纳的答案对我也适用。但是问题中的代码示例太复杂了,大部分代码与问题无关。 - Gary Wang
1个回答

9

如果您的_metric函数的输出是一个Series,那么您可能应该使用meta=('您的series的列名','输出的dtype')

这对我很有用。


请问为什么在这里使用元组会有所不同?这在文档中并不明显。 - ta8
2
很抱歉,我已经将近两年没有使用Dask了。我猜meta参数告诉Dask你想要使用的部分和输出类型,可能是因为如果你不设置dtype,Dask可能会推断出一个错误的数据类型。 - Cherrymelon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接