我在csv
文件(数据帧的列A)中有一个凌乱的列。
using CSV, DataFrames
df = DataFrame(A = ["1", "3", "-", "4", missing, "9"], B = ["M", "F", "R", "G", "Z", "D"])
我想做的是:
Float64
)"-"
中转换字符串missing
该策略将是首先定义一个新的列矢量,该矢量填充有缺失的
df[:C] = fill(missing, size(df)[1])
,然后使用for循环执行两次转换
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]
时,我有一列仅填充了缺失。
我在做什么错了?
答案 0 :(得分:2)
您的代码有几个问题,但首先让我展示一下如何编写此转换:
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]
来访问数据帧中的列(当前两者等效,但将来可能会改变)。