我有一个使用“..”而不是 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:无法将 Float64 类型的对象“转换”为 String 类型的对象。
Here is a portion of the dataset for reference.
感谢任何帮助,谢谢!
答案 0 :(得分:2)
NaN 是未定义浮点运算的保留字,例如为 1/0,不应被滥用于其他目的。改用 missing
或 nothing
。
在您的示例中,您要分配 NaN
的 DataFrame 列具有 String 类型,但 NaN
是 Float64。您应该将解析后的数据放入一个新的 DataFrame 中,将数组的元素类型转换为 Float64(或 Any,在本例中删除以下解决方案中的 float.
)。
using DataFrames
df = DataFrame(rand(["..", 5.5, -3.9], 5, 5))
df2 = DataFrame([float.(replace(c, (".." => NaN))) for c in eachcol(df)])
失踪:
df2 = DataFrame([float.(replace(c, (".." => missing))) for c in eachcol(df)])
答案 1 :(得分:2)
另一种方法是像这样使用广播:
Resource Explorer
(注意自动生成列名的构造函数中的 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
的例子,因为正如lunben 指出的,missing
在 Julia 中没有被用来表示缺失(但你可以在这段代码中同样使用它)。
使用广播的好处是您不必考虑类型提升 - 它会自动发生,因此您不会出错。
答案 2 :(得分:0)
您实际上是在询问如何处理缺少特定符号的文件。
假设这是您的文件:
dataset="c1#c2
a#12.5
b#..
c#3.3"
您可以将这个 Julia 解读为:
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}