正在读取.csv文件,其中的小数由逗号分隔,并带有csv.jl

正在读取.csv文件,其中的小数由逗号分隔,并带有csv.jl,csv,dataframe,julia,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{U

我正试图将一些数据读入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])
但是我没有找到一个选项来告诉朱莉娅用一个点来代替逗号。 我的下一个想法是首先替换逗号,然后转换它:

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
关键字指定列类型(然后它将隐式解析字符串条目)

编辑:根据CSV。jl的
读取
方法支持
十进制
关键字(从v0.2.0版开始),允许您执行以下操作

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


EDIT:删除了从DataFrames.jl中选择使用
readtable
的提示,因为它似乎不赞成使用
CSV.read
,一种简单的方法是将文件读取为字符串,用点替换逗号小数分隔符,然后从中创建数据帧:

s = replace(readstring("test.csv"), ",", ".")
CSV.read(IOBuffer(s); delim=';', types=[String, Float64, Float64, Float64])
请注意,您可以使用
types
关键字指定列类型(然后它将隐式解析字符串条目)

编辑:根据CSV。jl的
读取
方法支持
十进制
关键字(从v0.2.0版开始),允许您执行以下操作

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


EDIT:从DataFrames.jl中删除了交替使用
readtable
的提示,因为它似乎不赞成使用
CSV。read

注意
float(替换(d[:,2],“,”,“,”)
可能应该是
float。(替换(d[:,2],“,”,“,”))
(广播操作)。您可能还想看看,特别是它的
readdlm2()
方法。另外,从技术上讲,您的输入文件不是csv文件(数据不是逗号分隔的)。请注意
float(替换(d[:,2],“,”,”)
应该是
float.(替换(d[:,2],“,”,”)
(广播操作)。您可能还想看看,特别是它的
readdlm2()
方法。另外,从技术上讲,您的输入文件不是csv文件(数据不是逗号分隔的)。csv的第一个参数是
String
、文件路径或
IO
对象。谢谢。很好用!我已经在帮助中找到了我上一个问题的答案…按照建议使用
readtable
,我收到两条错误消息:
readtable已弃用,改为使用CSV包中的CSV.read
参数错误:参数'decimal'尚不受支持。
CSV.read
也应支持
decimal
,但对我来说它不起作用。另外,对于包含更多列的数据集来说,指定所有列的类型非常麻烦……我不知道这种弃用。删除了答案中的相应参考。使用
Pkg.status(“CSV”)
检查CSV包的版本。对于
decimal
关键字,您必须至少具有
v0.2.0
。谢谢。它现在起作用了。。。我总是在文件名后面加逗号,而不是分号。
CSV.read()
的第一个参数是
字符串、文件路径或
IO
对象。谢谢。很好用!我已经在帮助中找到了我上一个问题的答案…按照建议使用
readtable
,我收到两条错误消息:
readtable已弃用,改为使用CSV包中的CSV.read
参数错误:参数'decimal'尚不受支持。
CSV.read
也应支持
decimal
,但对我来说它不起作用。另外,对于包含更多列的数据集来说,指定所有列的类型非常麻烦……我不知道这种弃用。删除了答案中的相应参考。使用
Pkg.status(“CSV”)
检查CSV包的版本。对于
decimal
关键字,您必须至少具有
v0.2.0
。谢谢。它现在起作用了。。。我总是在文件名后面加逗号,而不是分号。