Julia DataFrame基于行条件转换列失败问题求助
Julia DataFrames transform条件列转换问题解决
问题原因
你写的cleaner函数是按单个元素处理逻辑,但transform默认会把整个列向量作为参数传给函数,导致name == "svietnam"得到的是布尔向量,if语句无法正确处理这种向量,因此字符串比较逻辑失效。另外,else分支返回的Missing是类型而非实例,也会导致结果不符合预期。
修复方案
方案1:使用ByRow逐行处理
修改函数返回值为missing实例,并在transform调用时加上ByRow,让函数逐行接收单个元素:
function cleaner(name, cc) if name == "svietnam" "DRV" elseif name == "vietnam" "RVN" else missing # 改为missing实例,而非Missing类型 end end # 添加ByRow,让函数逐行处理每行的name和country_code元素 formal_long_vietnamcleaned = transform(formal_long, [:name, :country_code] => ByRow(cleaner) => :cleaned_cc )
方案2:向量化写法(无需自定义函数)
直接用向量化的ifelse实现逻辑,更简洁:
formal_long_vietnamcleaned = transform(formal_long, :name => (x -> ifelse.(x .== "svietnam", "DRV", ifelse.(x .== "vietnam", "RVN", missing))) => :cleaned_cc )
或者用@.宏简化广播操作:
formal_long_vietnamcleaned = transform(formal_long, :name => x -> @. ifelse(x == "svietnam", "DRV", ifelse(x == "vietnam", "RVN", missing)) => :cleaned_cc )
内容的提问来源于stack exchange,提问作者KeynesCoeFen
相关产品推荐
相关产品推荐

