Dataframe 初始化缺少值的列并复制+;将数据帧的另一列转换为初始化列

Dataframe 初始化缺少值的列并复制+;将数据帧的另一列转换为初始化列,dataframe,julia,na,missing-data,Dataframe,Julia,Na,Missing Data,我在csv文件中有一个凌乱的列(数据帧的a列) 我想做的是: 将整数从字符串转换为数字(例如Float64) 在缺失中转换字符串“-” 策略是首先定义一个新的列向量,该列向量中填充缺少的元素 df[:C] = fill(missing, size(df)[1]) 然后使用for循环执行2个转换 for i in 1:size(df)[1] if df[:A][i] == "-" continue else df[:C][i] = parse(Fl

我在
csv
文件中有一个凌乱的列(数据帧的a列)

我想做的是:

  • 将整数从字符串转换为数字(例如
    Float64
  • 缺失中转换字符串
    “-”
  • 策略是首先定义一个新的列向量,该列向量中填充缺少的元素

    df[:C] = fill(missing, size(df)[1])
    
    然后使用for循环执行2个转换

    for i in 1:size(df)[1]
        if df[:A][i] == "-"
            continue
        else
            df[:C][i] = parse(Float64,df[:A][i])
        end
    end
    
    但是,当查看
    df[:C]
    时,我有一列只填充了missing。
    我做错了什么?

    您的代码有几个问题,但首先让我说明如何编写此转换:

    df.C = passmissing(parse).(Float64, replace(df.A, "-"=>missing))
    
    这不是做这件事的最有效的方法,但很容易推理

    使用循环的实现可能如下所示:

    df.C = similar(df.A, Union{Float64, Missing});
    
    for (i, a) in enumerate(df.A)
        if !ismissing(a) && a != "-"
            df.C[i] = parse(Float64, a)
        else
            df.C[i] = missing
        end
    end
    
    请注意,默认情况下,
    similor
    将用
    missing
    填充
    df.C
    ,因此可以删除
    else
    部分,但此行为没有文档记录,因此编写它更安全

    您还可以使用理解:

    df. C = [ismissing(a) || a == "-" ? missing : parse(Float64, a) for a in df.A]
    
    现在,要修复代码,您可以编写:

    # note a different initialization
    # in your code df.C allowed only values of Missing type and disallows of Float64 type
    df.C = Vector{Union{Float64, Missing}}(missing, size(df, 1))
    
    for i in 1:size(df)[1]
        # note that we need to handle missing value and "=" separately
        if ismissing(df.A[i]) || df.A[i] == "-"
            continue
        else
            df.C[i] = parse(Float64,df.A[i])
        end
    end
    

    最后请注意,最好编写
    df.C
    而不是
    df[:C]
    来访问数据帧中的一列(目前两者都是等效的,但将来可能会发生变化)。

    在建议的修复方案中,您是否应该检查a列而不是C列中缺少的或“-”元素?我想这也是问题的症结所在。谢谢你,修正了。我知道这个bug,但复制粘贴的风险如下:)。事实上,这就是我喜欢第一个解决方案的原因,因为它使用基于转换的方法。谢谢,我也解决了这个问题
    # note a different initialization
    # in your code df.C allowed only values of Missing type and disallows of Float64 type
    df.C = Vector{Union{Float64, Missing}}(missing, size(df, 1))
    
    for i in 1:size(df)[1]
        # note that we need to handle missing value and "=" separately
        if ismissing(df.A[i]) || df.A[i] == "-"
            continue
        else
            df.C[i] = parse(Float64,df.A[i])
        end
    end