尝试从Julia中的箭头数据帧获取行时发生MethodError

尝试从Julia中的箭头数据帧获取行时发生MethodError,julia,parquet,apache-arrow,Julia,Parquet,Apache Arrow,我的数据集如下所示: 我拿了一个CSV文件,将其转换为拼花地板,然后将其发送到Arrow。我这样做是有原因的。我的目标是访问第行“阿尔及利亚”中的信息。这是我的代码: df = CSV.read("temp.csv", DataFrame) write_parquet("data_file.parquet", df) df = DataFrame(read_parquet("data_file.parquet")) Arrow.wri

我的数据集如下所示:

我拿了一个CSV文件,将其转换为拼花地板,然后将其发送到Arrow。我这样做是有原因的。我的目标是访问第
行“阿尔及利亚”
中的信息。这是我的代码:

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中输入“阿尔及利亚”时得到的结果

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

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, ::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

您需要矢量化
平均值
,请参见下面的代码:

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

因此,
阿尔及利亚
中的一列似乎包含字符串而不是浮点数

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

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

请删除冥王星特有的
开始
结束
块,并使其他人不必很难阅读您的代码。您能告诉我们在REPL中键入
阿尔及利亚
时输出了什么吗?@GabrielHassler检查edits@oo92对不起,我没说清楚,我希望看到阿尔及利亚
中每个列的类型,通常在REPL中输出(尽管显然不是在您的特定编辑器中)。为了使
mean
起作用,阿尔及利亚
alegaria
中的所有元素应为
Float64
类型。试试这个:
all(eltype.(df[!,i]表示i=1:size(df,2))。==Float64)
看看它是否返回
true
。如果不是,用
findall(eltype.(df[!,i]for i=1:size(df,2))。!=Float64)找出哪些列的类型是错误的
,然后使用
parse(x,Float64)
的某个版本将它们转换为正确的类型。当然,但这不是我一直坚持的,你写的“最后一块”这就是那里的代码,在矢量化方面是不正确的。在这种情况下,也许您可以做一些MWE来更清楚地显示您需要什么:-)这就是抛出所述错误的原因:
alegaria=df[df.“Country/Region.”==“alegaria”,4:end]
这里没有涉及任何添加(
+
)。也许是因为那条被注释掉的线?不是。只是删除了它,没有任何区别。请检查编辑。我试图实现您的逻辑,但遇到了相同的错误。您是否尝试了
findall(eltype.(df[!,I]for I=1:size(df,2))。!=Float64)
以查看是否存在错误类型的列?最后,
mean
试图向
字符串添加一个
Float64
,因此某个地方必须有一个
字符串
。它只返回一个从1到n的整数列表,其中n是行的大小