【问题标题】:Julia : Dataframes packages having trouble to convert column containing both int and floatJulia:Dataframes 包无法转换包含 int 和 float 的列
【发布时间】:2018-09-23 21:03:59
【问题描述】:

我是R 用户,对Julia 非常感兴趣。我没有计算机科学背景。我只是尝试使用以下命令读取Juno 中的“csv”文件:

using CSV
using DataFrames

df = CSV.read(joinpath(Pkg.dir("DataFrames"), 
"path/to/database.csv"));

并收到以下错误消息

CSV.CSVError('error parsing a 'Int64' value on column 26, row 289; encountered '.'"
in read at CSV/src/Source.jl:294
in #read#29 at CSV/src/Source.jl:299
in stream! at DataStreams/src/DataStreams.jl:145
in stream!#5 at DataStreams/src/DataStreams.jl:151
in stream! at DataStreams/src/DataStreams.jl:187
in streamto! at DataStreams/src/DataStreams.jl:173
in streamfrom at CSV/src/Source.jl:195
in paresefield at CSV/src/paresefield.jl:107
in paresefield at CSV/src/paresefield.jl:127
in checknullend at CSV/src/paresefield.jl:56

我查看数据框中指示的条目:第287行、第288行分别是3033(似乎是Integer类型),第289行是30.445(类型为float)。

问题是DataFramesInt 填充列并在看到Float 时停止吗?

在此先感谢

【问题讨论】:

  • 你会做一个MCVE吗?我想亲眼看看。
  • 非常感谢您的回答@rickhg12hs。我只是尝试创建一个 MCVE,但这个理论不起作用(从 MCVE 导入数据并没有问题,从 csv 中输入 30, 31, 32, 22.51234)。但事实仍然是,这是在 Julia 指示的行中遇到的模式。因为它是一个研究数据库,我不能把它放在互联网上抱歉。因此,我删除了问题的最后一个短语。
  • 例如,io = IOBuffer("1,2,3,4\n5,6,7,8\n9,10,11,12\n13,14.2,15,16");df=CSV.read(io, datarow=1) 适合我。
  • 出于好奇,如果你尝试df = CSV.read(joinpath(Pkg.dir("DataFrames"), "path/to/database.csv"), datarow=289)会发生什么?
  • 有如下错误输出:function joinpath does not accept keyword arguments [1] kwfunc(::Any) at ./boot.jl:237 [2] eval(::Module, ::Any) at ./boot.jl:235 [3] eval(::Any) at ./boot.jl:234 [4] macro expansion at /Applications/JuliaPro-0.6.2.2.app/Contents/Resources/pkgs-0.6.2.2/v0.6/Atom/src/repl.jl:117 [inlined] [5] anonymous at ./:?

标签: dataframe julia juno-ide


【解决方案1】:

问题是浮点数在数据集中发生得太晚了。默认情况下,CSV.jl 使用等于100rows_for_type_detect 值。这意味着只有前 100 行用于确定输出中列的类型。将CSV.read中的rows_for_type_detect关键字参数设置为例如300 并且一切都应该正常工作。

或者,您可以传递 types 关键字参数来手动设置列类型(在这种情况下,此列的 Float64 是合适的)。

【讨论】:

  • @非常感谢@BogumilKaminsky。这确实解决了问题。但是,在设置rows_for_type_detect = 300 后问题仍然存在,我将其设置为 811(数据库的长度)。这次它成功了,但根据命令@time df = CSV.read("path/tofile.csv") 花了 26.8 秒。有没有一种方法可以更轻松有效地读取 csv 文件(cf 命令 read.csv("path/tofile.csv") of R 需要 0.023 秒(快 1000 倍),而无需指定特定的行数)?
猜你喜欢
  • 1970-01-01
  • 2016-02-28
  • 2012-05-28
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多