尝试从 Julia 中的 Arrow Dataframe 获取一行时出现 MethodError

问题描述

我有一个如下所示的数据集:

enter image description here

我正在获取一个 CSV 文件,将其转换为 Parquet,然后将其发送到 Arrow。我这样做是有原因的。我的目标是访问行 "Algeria" 中的信息。这是我的代码

df = CSV.read("temp.csv",DataFrame)
write_parquet("data_file.parquet",df)
df = DataFrame(read_parquet("data_file.parquet"))
Arrow.write("data_file.arrow",df)
df = DataFrame(Arrow.Table("data_file.arrow"))

dates = names(df)[5:end]
countries = unique(df[:,:"Country/Region"])

algeria = df[df."Country/Region" .== "Algeria",4:end]
# Print(sum(eachcol(algeria)))
Print(Statistics.mean(eachcol(algeria)))

但是最后一部分试图从 Arrow 检索数据,却抛出了这个错误

MethodError: no method matching +(::Float64,::String)

Closest candidates are:

+(::Any,::Any,!Matched::Any,!Matched::Any...) at operators.jl:538

+(::Float64,!Matched::Float64) at float.jl:401

+(!Matched::ChainRulescore.One,::Any) at /home/onur/.julia/packages/ChainRulescore/7d1hl/src/differential_arithmetic.jl:94

我做错了什么?

这是我在 REPL 中输入“Algeria”时得到的

enter image description here

更新:实施加布里埃尔的建议:

begin
    algeria = df[df."Country/Region" .== "Algeria",4:end]
    
    for i = 1:size(algeria,2)
        if eltype(algeria[!,i]) == String
            algeria[!,i] = parse.(Float64,algeria[!,i])
        end
    end
    
    Statistics.mean(eachcol(algeria))
end

这是错误

MethodError: no method matching +(::Float64,::Any) at /home/onur/.julia/packages/ChainRulescore/7d1hl/src/differential_arithmetic.jl:94

解决方法

您需要对 mean 进行矢量化,请参阅以下代码:

julia> df = DataFrame(a=1:3,b=1.5:1:3.5)
3×2 DataFrame
 Row │ a      b
     │ Int64  Float64
─────┼────────────────
   1 │     1      1.5
   2 │     2      2.5
   3 │     3      3.5

julia> Statistics.mean.(eachcol(df))
2-element Vector{Float64}:
 2.0
 2.5
,

所以看起来 algeria 中的一列包含字符串而不是浮点数。

在计算平均值之前尝试这样做:

for i = 1:size(algeria,2)
    if eltype(algeria[!,i]) == String
        algeria[!,i] = parse.(Float64,algeria[!,i])
    end
end

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...