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

Julia中如何用ifelse为DataFrame创建新变量并修复transform!报错

DataFrames.transform! 结合if-else创建新列的问题解决

报错原因

你的代码错误出在transform!的参数格式不符合DataFrames的规范,同时ifelse的判断条件传入了错误的类型:

  1. transform!的列转换要求遵循源列名 => 转换逻辑 => 新列名的格式,你直接在转换逻辑的位置执行了筛选操作,语法结构错误。
  2. datos[datos.puntaje .< 9,:]返回的是符合条件的子DataFrame,不是布尔值/布尔数组,完全不能作为ifelse的判断条件,因此触发了「非布尔值用于布尔上下文」的类型错误。

正确实现代码

写法1:向量化ifelse(无需额外依赖,适合简单逻辑)

using DataFrames
datos = DataFrame(nombre =["ANGELICA","BRENDA","LILIANA","MARCO","FABIAN","MAURICIO"],
    grupo = ["A","A","B","B","C","C"],
    puntaje = [10,9,8,8,9,7]);
# 直接传入匿名函数做向量化判断
transform!(datos, :puntaje => (x -> ifelse.(x .< 9, "Suficiente", "Excelente")) => :nota)

写法2:ByRow逐行判断(适合复杂逻辑,可读性更高)

如果后续判断逻辑会变得更复杂,可以把判断逻辑封装成独立的标量函数,用ByRow包裹后传入transform!:

function get_nota(puntaje)
    if puntaje < 9
        return "Suficiente"
    else
        return "Excelente"
    end
end
transform!(datos, :puntaje => ByRow(get_nota) => :nota)

运行任意一种写法后,datos就会新增nota列,输出结果如下:

6×4 DataFrame
 Row │ nombre    grupo   puntaje  nota
     │ String    String  Int64    String
─────┼─────────────────────────────────────
   1 │ ANGELICA  A            10  Excelente
   2 │ BRENDA    A             9  Excelente
   3 │ LILIANA   B             8  Suficiente
   4 │ MARCO     B             8  Suficiente
   5 │ FABIAN    C             9  Excelente
   6 │ MAURICIO  C             7  Suficiente

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:18:02