我有一些格式错误的数据。具体来说,我有一些数字列,其中包含一些带有虚假文本的元素(例如“8米”而不是“8”)。我想使用readtable读取数据,对数据进行必要的修复,然后将列转换为Float64,使其行为正确(比较等)。
似乎有一个名为@transform的宏会进行转换,但它已被删除。我现在该怎么做?
目前我最好的解决方案是清理数据,将其作为csv写出,然后使用readtable重新读取并指定eltypes。但那太可怕了。
我还能做什么?
答案 0 :(得分:4)
无需通过csv文件运行。您可以直接更改或更新DataFrame。
using DataFrames
# Lets make up some data
df=DataFrame(A=rand(5),B=["8", "9 meters", "4.5", "3m", "12.0"])
# And then make a function to clean the data
function fixdata(arr)
result = DataArray(Float64, length(arr))
reg = r"[0-9]+\.*[0-9]*"
for i = 1:length(arr)
m = match(reg, arr[i])
if m == nothing
result[i] = NA
else
result[i] = float64(m.match)
end
end
result
end
# Then just apply the function to the column to clean the data
# and then replace the column with the cleaned data.
df[:B] = fixdata(df[:B])
答案 1 :(得分:3)
假设您有dataframe = df
和列B
,其中包含要转换的字符串。
首先,这会将字符串转换为浮点数,如果失败则返回NA:
string_to_float(str) = try convert(Float64, str) catch return(NA) end
然后转换该列:
df[:B] = map(string -> string_to_float string, df[:B])
替代短版
df[:B] = map(string_to_float, df[:B])