使用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
相关产品推荐
相关产品推荐

