我有一个数据框,其中某些列缺少值。我希望如果找到缺失值,则从第二列中选择一个替代值。例如,在:
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]),但似乎这对只接受标量,而且广播我也没有成功。
你有什么建议吗?
您可以使用coalesce:
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\nRun Code Online (Sandbox Code Playgroud)\n或者如果您喜欢管道感知功能:
\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n这是相同的,但不需要您记住coalesce:
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\nRun Code Online (Sandbox Code Playgroud)\n