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



我正在尝试将一些数据读入 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=";")

朱莉娅识别以下类型:

eltypes(d)
CategoricalArrays.CategoricalString{UInt32}
String
String
String

我现在如何将整列变成浮点数,逗号被点替换?我的第一个想法是使用:

float(d[1,2])

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

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中?

多谢!

此致敬意。

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

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

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

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

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

编辑:删除了从DataFrames.jl替代使用readtable的提示,因为它似乎已被弃用以支持CSV.read

最新更新