问题描述
我正在获取一个 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”时得到的
更新:实施加布里埃尔的建议:
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