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

使用Dask的apply函数新增两列时报元组赋值不支持错误如何解决

问题原因

  • Dask DataFrame 目前不支持直接使用 tuple 类型的多列名组合进行批量赋值,这是触发 NotImplementedError 报错的直接原因。
  • 调整后的代码中 apply 返回的是二元组,但 meta 参数仍然指定为 dict,和返回值结构不匹配,即便赋值逻辑支持也会触发类型校验错误。

可行替代方案

方案1:apply结果合并法(推荐,适合多列共用计算逻辑的场景)

调整apply的返回结构声明,将计算得到的多列结果和原Dask DataFrame合并即可:

import pandas as pd
import dask.dataframe as dd

df = pd.DataFrame({
    'height':  [6.21, 5.12, 5.85, 5.78, 5.98],
    'weight': [150, 126, 133, 164, 203]
})
df_dask = dd.from_pandas(df, npartitions=2) 

s = """
obj.weight + 100, obj.weight + 200
"""
# 声明apply返回的两列结构
new_cols = df_dask.apply(
    lambda obj: eval(s), 
    meta=[('new_weight', float), ('new_weight2', float)], 
    axis=1
)
# 合并新列到原表
df_dask = df_dask.join(new_cols)

方案2:逐列赋值法(适合列数较少的场景)

如果仅需新增2-3列,拆分逻辑分别赋值即可,代码可读性更高:

s1 = "obj.weight + 100"
s2 = "obj.weight + 200"
df_dask['new_weight'] = df_dask.apply(lambda obj: eval(s1), meta=float, axis=1)
df_dask['new_weight2'] = df_dask.apply(lambda obj: eval(s2), meta=float, axis=1)

提示:如果两个新列的计算逻辑有共用的中间步骤,优先选择方案1,避免重复执行相同计算逻辑浪费资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:06:03