【问题标题】:Change dataframe value to NaN in Julia在 Julia 中将数据框值更改为 NaN
【发布时间】:2021-04-16 17:23:24
【问题描述】:

我有一个使用“..”而不是 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: Cannot 'convert' an object of Float64 to an object of type String.

Here is a portion of the dataset for reference.

感谢任何帮助,谢谢!

【问题讨论】:

  • 你能发布eltypes(df) 的结果,df 是你的DataFrame 吗?这样我们就知道了 DataFrame 列的类型。此外,根据您发布的图像,“..”仅出现在 DataFrame 的第四列中,那么为什么要在您发布的代码中迭代整个 DataFrame?你不能只遍历第四列吗?

标签: dataframe julia nan


【解决方案1】:

另一种方法是像这样使用广播:

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参数)

这里我举了一个missing 的例子,因为正如lungben 所说,NaN 在 Julia 中不用于表示缺失(但您也可以在这段代码中同样使用它)。

使用广播的好处是您不必考虑类型提升 - 它会自动发生,因此您不会出错。

【讨论】:

    【解决方案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)])
    

    【讨论】:

      【解决方案3】:

      您实际上是在询问如何处理带有特定缺失符号的文件。

      假设这是你的文件:

      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}
      

      【讨论】:

        猜你喜欢
        • 2021-06-19
        • 2023-01-10
        • 2020-10-22
        • 2021-08-26
        • 2021-01-12
        • 2021-03-13
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多