将Julia中的dataframe值更改为NaN
我有一个使用“.”而不是NaN的数据集,我目前正在尝试将这些字符串转换为NaN。我尝试了以下方法:将Julia中的dataframe值更改为NaN,dataframe,julia,nan,Dataframe,Julia,Nan,我有一个使用“.”而不是NaN的数据集,我目前正在尝试将这些字符串转换为NaN。我尝试了以下方法: for i in 1:length(final_df[:,1]) for j in 1:length(final_df[1,:]) if final_df[i,j] == ".." final_df[i,j] = NaN end end end 但是,我一直遇到以下错误:MethodError:无法将
for i in 1:length(final_df[:,1])
for j in 1:length(final_df[1,:])
if final_df[i,j] == ".."
final_df[i,j] = NaN
end
end
end
但是,我一直遇到以下错误:MethodError:无法将Float64类型的对象“转换”为String类型的对象
感谢您的帮助,谢谢 NaN是用于未定义浮点运算的保留字,例如用于1/0,不得用于其他目的。改用
缺失
或无
在您的示例中,要分配给NaN
的数据帧列具有字符串类型,但NaN
是浮点64。您应该将解析后的数据放入一个新的数据框中,将数组的元素类型转换为Float64(或任意,在本例中,在下面的解决方案中删除float.
)
关于失踪:
df2 = DataFrame([float.(replace(c, (".." => missing))) for c in eachcol(df)])
另一种方法是使用如下广播:
julia> using DataFrames
julia> df = DataFrame(rand(["..", 5.5, -3.9], 5, 5), :auto)
5×5 DataFrame
Row │ x1 x2 x3 x4 x5
│ Any Any Any Any Any
─────┼─────────────────────────────
1 │ 5.5 5.5 -3.9 -3.9 ..
2 │ -3.9 -3.9 .. .. 5.5
3 │ .. -3.9 .. 5.5 5.5
4 │ .. .. .. 5.5 5.5
5 │ 5.5 -3.9 -3.9 .. 5.5
julia> ifelse.(df .== "..", missing, df)
5×5 DataFrame
Row │ x1 x2 x3 x4 x5
│ Float64? Float64? Float64? Float64? Float64?
─────┼───────────────────────────────────────────────────────
1 │ 5.5 5.5 -3.9 -3.9 missing
2 │ -3.9 -3.9 missing missing 5.5
3 │ missing -3.9 missing 5.5 5.5
4 │ missing missing missing 5.5 5.5
5 │ 5.5 -3.9 -3.9 missing 5.5
(注意构造函数中自动生成列名的:auto
参数)
这里我举一个缺失的例子,因为正如lungben指出的那样,NaN
在Julia中没有被用来表示缺失(但你也可以在这段代码中同样很好地使用它)
使用广播的好处是,您不必考虑类型升级-它将自动发生,因此您不应出错。您实际上是在询问如何处理缺少特定符号的文件
假设这是您的文件:
dataset="c1#c2
a#12.5
b#..
c#3.3"
你可以这样读:
julia> d = CSV.File(IOBuffer(dataset), delim="#", missingstring="..") |> DataFrame
3×2 DataFrame
Row │ c1 c2
│ String Float64?
─────┼───────────────────
1 │ a 12.5
2 │ b missing
3 │ c 3.3
请注意,c2
列的类型为:
julia> eltype(d.c2)
Union{Missing, Float64}
您能发布eltypes(df)
的结果吗df
是您的数据帧?这是为了让我们知道数据帧中列的类型。此外,根据您发布的图像,它会显示“.”仅出现在数据帧的第四列中,那么为什么您要在发布的代码中迭代整个数据帧呢?你就不能重复第四列吗?
julia> eltype(d.c2)
Union{Missing, Float64}