如何在Julia中转换Dataframe列的类型?

时间:2014-03-11 19:36:02

标签: julia

我有一些格式错误的数据。具体来说,我有一些数字列,其中包含一些带有虚假文本的元素(例如“8米”而不是“8”)。我想使用readtable读取数据,对数据进行必要的修复,然后将列转换为Float64,使其行为正确(比较等)。

似乎有一个名为@transform的宏会进行转换,但它已被删除。我现在该怎么做?

目前我最好的解决方案是清理数据,将其作为csv写出,然后使用readtable重新读取并指定eltypes。但那太可怕了。

我还能做什么?

2 个答案:

答案 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])