Julia中如何用ifelse为DataFrame创建新变量并修复transform!报错
DataFrames.transform! 结合if-else创建新列的问题解决
报错原因
你的代码错误出在transform!的参数格式不符合DataFrames的规范,同时ifelse的判断条件传入了错误的类型:
transform!的列转换要求遵循源列名 => 转换逻辑 => 新列名的格式,你直接在转换逻辑的位置执行了筛选操作,语法结构错误。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
相关产品推荐
相关产品推荐

