用 Julia Dataframe 中另一列的值替换缺失值

Mic*_*rau 6 dataframe julia

我有一个数据框,其中某些列缺少值。我希望如果找到缺失值,则从第二列中选择一个替代值。例如,在:

df = DataFrame(x = [0, missing, 2], y=[2, 4, 6])
Run Code Online (Sandbox Code Playgroud)

我想missing用4代替。

目前我正在用这个解决方案解决这个问题:

for row in eachrow(df)
    if ismissing(row[:x])
        row[:x] = row[:y]
    end
end
Run Code Online (Sandbox Code Playgroud)

但我想知道是否可以找到避免 for 循环的更好解决方案。

我试过replace(A, old_new::Pair...; [count::Integer]),但似乎这对只接受标量,而且广播我也没有成功。

你有什么建议吗?

Bog*_*ski 5

您可以使用coalesce

\n
julia> df = DataFrame(x = [0, missing, 2], y=[2, 4, 6])\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 x        y\n     \xe2\x94\x82 Int64?   Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82       0      2\n   2 \xe2\x94\x82 missing      4\n   3 \xe2\x94\x82       2      6\n\njulia> df.x .= coalesce.(df.x, df.y)\n3-element Array{Union{Missing, Int64},1}:\n 0\n 4\n 2\n\njulia> df\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 x       y\n     \xe2\x94\x82 Int64?  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82      0      2\n   2 \xe2\x94\x82      4      4\n   3 \xe2\x94\x82      2      6\n
Run Code Online (Sandbox Code Playgroud)\n

或者如果您喜欢管道感知功能:

\n
julia> df = DataFrame(x = [0, missing, 2], y=[2, 4, 6])\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 x        y\n     \xe2\x94\x82 Int64?   Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82       0      2\n   2 \xe2\x94\x82 missing      4\n   3 \xe2\x94\x82       2      6\n\njulia> transform!(df, [:x, :y] => ByRow(coalesce) => :x)\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 x      y\n     \xe2\x94\x82 Int64  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     0      2\n   2 \xe2\x94\x82     4      4\n   3 \xe2\x94\x82     2      6\n
Run Code Online (Sandbox Code Playgroud)\n

这是相同的,但不需要您记住coalesce

\n
julia> df = DataFrame(x = [0, missing, 2], y=[2, 4, 6])\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 x        y\n     \xe2\x94\x82 Int64?   Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82       0      2\n   2 \xe2\x94\x82 missing      4\n   3 \xe2\x94\x82       2      6\n\njulia> transform!(df, [:x, :y] => ByRow((x,y) -> ismissing(x) ? y : x) => :x)\n3\xc3\x972 DataFrame\n Row \xe2\x94\x82 x      y\n     \xe2\x94\x82 Int64  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     0      2\n   2 \xe2\x94\x82     4      4\n   3 \xe2\x94\x82     2      6\n
Run Code Online (Sandbox Code Playgroud)\n