在 Julia 中将数据帧值更改为 NaN

时间:2021-04-16 02:57:44

标签: 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:无法将 Float64 类型的对象“转换”为 String 类型的对象。

Here is a portion of the dataset for reference.

感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:2)

NaN 是未定义浮点运算的保留字,例如为 1/0,不应被滥用于其他目的。改用 missingnothing

在您的示例中,您要分配 NaN 的 DataFrame 列具有 String 类型,但 NaN 是 Fl​​oat64。您应该将解析后的数据放入一个新的 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}