You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dask DataFrame执行apply时如何返回带字段和类型的结构化行?

解决方案

正确实现逻辑

你可以通过在自定义函数中返回pd.Series/字典,并匹配正确的meta参数实现类似Spark Row的结构化返回效果,完整示例如下:

import json
import pandas as pd
import dask.dataframe as dd

# 假设df为包含data列的Dask DataFrame
def process(row):
    json_data = json.loads(row.data)
    # 方式1:返回pd.Series,index对应输出列名
    return pd.Series(
        [json_data["a"], json_data["b"]],
        index=["a", "b"]
    )
    # 方式2:也可以直接返回字典,效果等价
    # return {"a": json_data["a"], "b": json_data["b"]}

result = df.apply(
    process,
    axis=1,
    # 显式指定输出结构,避免推断错误
    meta=pd.DataFrame(
        columns=["a", "b"],
        dtype={"a": int, "b": str} # 根据实际字段类型调整
    )
).compute()

报错原因说明

  • 首次返回Series报错AttributeError: 'Series' object has no attribute 'columns':Dask默认会尝试采样推断apply的输出结构,逐行apply的场景下推断容易失败,必须显式传入meta参数声明输出结构。
  • 传入meta列表后报错AttributeError: 'DataFrame' object has no attribute 'name':你的返回值对应多列DataFrame结构,但传入的meta参数结构与实际返回值不匹配,Dask误将返回值识别为Series类型导致冲突。

可选简化meta写法

如果不想构造空DataFrame,也可以直接传入列名+类型的元组列表,需要保证顺序和process返回的列顺序一致:

result = df.apply(
    process,
    axis=1,
    meta=[("a", int), ("b", str)] # 顺序和process返回的列顺序一致
).compute()

内容的提问来源于stack exchange,提问作者Nevermore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:18:02