Dataframe 将缺少的转换为Julia 1中的数值

Dataframe 将缺少的转换为Julia 1中的数值,dataframe,julia,Dataframe,Julia,我正在尝试将df中所有缺失的值转换为数值,例如0(是的,知道我在做什么…) 在Julia 0.6中,我可以写: julia> df = DataFrame( cat = ["green","blue","white"], v1 = [1.0,missing,2.0], v2 = [1,2,missing] ) julia> [df[ismissing.(df[i]),

我正在尝试将df中所有缺失的值转换为数值,例如0(是的,知道我在做什么…)

在Julia 0.6中,我可以写:

julia> df = DataFrame(
              cat = ["green","blue","white"],
              v1   = [1.0,missing,2.0],
              v2   = [1,2,missing]
            )
julia> [df[ismissing.(df[i]), i] = 0 for i in names(df)]
并获得:

julia> df
3×3 DataFrames.DataFrame
│ Row │ cat   │ v1  │ v2 │
├─────┼───────┼─────┼────┤
│ 1   │ green │ 1.0 │ 1  │
│ 2   │ blue  │ 0.0 │ 2  │
│ 3   │ white │ 2.0 │ 0  │
如果我在Julia 0.7中尝试,我会得到一个非常奇怪的错误:

MethodError:无法
Float64类型的对象转换为对象
字符串类型


我无法获取我试图转换为字符串的内容???任何解释(和解决方法)?

此问题的原因是Julia 0.6和Julia 1.0之间的广播机制发生了变化(它用于DataFrames.jl中的
插入多个条目!
函数)。最后
fill并尝试在检查集合是否为空之前进行转换

事实上,如果你想做一个完全通用的替换(我知道你想这样做),这有点复杂,效率比你在Base中的要低(原因是你不能依赖于检查向量中元素的类型,例如,你可以将
Int
分配给
Float64
的向量,它们有不同的类型):

现在你可以走了:

foreach(col -> myreplacemissing!(col[2], 0), eachcol(df))

虽然我很欣赏Bogumil Kaminski的回答(也是因为我现在理解了失败背后的原因),但如果非数字列中存在缺失元素,则其建议的解决方案将失败,例如:

df = DataFrame(
  cat = ["green","blue",missing],
  v1   = [1.0,missing,2.0],
  v2   = [1,2,missing]
)
我可以做的是使用(根据我的需要,选择或仅使用一个):

优点是,我可以为不同类型的列选择所需的值类型作为“缺少替换”(例如,0表示数字或“”表示字符串)

编辑:

也许更具可读性,再次感谢:


[df[ismissing.(df[i]),i]=0表示i in names(df)if Base.nonmissingtype(eltype(df[i]),如果我删除
cat
列,它就会工作。它似乎仍在尝试应用赋值,即使
cat
中的数组是空的,而在Julia 0.6中,让我们说“更智能”,意识到操作位置的设置为空..添加
if-typeof(df[i])
df = DataFrame(
  cat = ["green","blue",missing],
  v1   = [1.0,missing,2.0],
  v2   = [1,2,missing]
)
[df[ismissing.(df[i]), i] = 0 for i in names(df) if  typeintersect(Number, eltype(df[i])) != Union{}]
[df[ismissing.(df[i]), i] = "" for i in names(df) if  typeintersect(String, eltype(df[i])) != Union{}]
[df[ismissing.(df[i]), i] = 0 for i in names(df) if  Base.nonmissingtype(eltype(df[i])) <: Number]
[df[ismissing.(df[i]), i] = "" for i in names(df) if  Base.nonmissingtype(eltype(df[i])) <: String]