我正在尝试将一些数据读入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?
非常感谢!
最好的问候。
答案 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
。