Есть несколько проблем с вашим кодом, но сначала позвольте мне показать, как бы я написал это преобразование:
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
Обратите внимание, что similar
по умолчанию заполнит df.C
на missing
, так что часть 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]
(в настоящее время оба эквивалентны, но это может измениться в будущем).