读取带有小数的.csv文件,用逗号分隔CSV.jl

时间:2018-01-28 12:00:31

标签: csv dataframe julia

我正在尝试将一些数据读入julia进入数据框以使用它。 .csv文件的最小示例如下所示:

A; B; C; D
ab; 1,23; 4; 9,2
ab; 3,4; 7; 1,1
ba; 6; 2,3; 8,6

我将以下内容加载到包中并读取数据:

using DataFrames
using CSV
d = CSV.read( "test.csv", delim=";")

Julia认识到以下类型:

eltypes(d)

CategoricalArrays.CategoricalString{UInt32}
String
String
String

现在我怎么能用逗号替换为点来将整列变成浮点数?我的第一个想法是使用:

float(d[1,2])

但是我找不到告诉julia用点替换逗号的选项。 我的下一个想法是首先替换逗号,然后转换它:

float(replace(d[1,2], ",", "."))

在单个单元格上工作正常但在整个列上没有效果:

float(replace(d[:,2], ",", "."))
MethodError: no method matching 
replace(::WeakRefStrings.WeakRefStringArray{WeakRefString{UInt8},1,Union{}}, 
::String, ::String)

我也尝试过:

d = CSV.read( "test.csv", delim=";", decimal=",")

这也只是出错......

任何想法如何处理这个问题以及如何有效地将数据读入julia?

非常感谢!

最好的问候。

1 个答案:

答案 0 :(得分:3)

一种简单的方法是将文件读取为字符串,用点替换逗号小数分隔符,然后从中创建DataFrame:

s = replace(readstring("test.csv"), ",", ".")
CSV.read(IOBuffer(s); delim=';', types=[String, Float64, Float64, Float64])

请注意,您可以使用types关键字来指定列类型(然后它将隐式解析字符串条目)。

编辑:根据this github issue,CSV.jl的read方法支持decimal关键字(从版本v0.2.0开始)允许你这样做

CSV.read("test.csv"; delim=';', decimal=',', types=[String, Float64, Float64, Float64])

编辑:删除提示,或者使用DataFrames.jl中的readtable,因为它似乎已被弃用,而不是CSV.read