尝试从Julia中的箭头数据帧获取行时发生MethodError
我的数据集如下所示: 我拿了一个CSV文件,将其转换为拼花地板,然后将其发送到Arrow。我这样做是有原因的。我的目标是访问第尝试从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
行“阿尔及利亚”
中的信息。这是我的代码:
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是行的大小