Dataframe 如何有效地使用向量追加数据帧列?
使用Julia 1.1: 以下最低限度的代码可以正常工作并满足我的要求:Dataframe 如何有效地使用向量追加数据帧列?,dataframe,append,julia,Dataframe,Append,Julia,使用Julia 1.1: 以下最低限度的代码可以正常工作并满足我的要求: function test() df = DataFrame(NbAlternative = Int[], NbMonteCarlo = Int[], Similarity = Float64[]) append!(df.NbAlternative, ones(Int, 5)) df end 将向量追加到df的一列。注意:在我的整个代码中,我添加了一个比one'返回更复杂的Vector{Int
function test()
df = DataFrame(NbAlternative = Int[], NbMonteCarlo = Int[], Similarity = Float64[])
append!(df.NbAlternative, ones(Int, 5))
df
end
将向量追加到df
的一列。注意:在我的整个代码中,我添加了一个比one'
返回更复杂的Vector{Int}
但是,@code\u warntype test()
确实返回:
%8 = invoke DataFrames.getindex(%7::DataFrame, :NbAlternative::Symbol)::AbstractArray{T,1} where T
也就是说,我想这不是很有效。我无法理解此@code\u warntype
错误的含义。更一般地说,我如何理解@code\u warntype
返回的错误并修复它们,这对我来说是一个反复出现的不清楚的问题
编辑:@BogumiłKamiński的回答
那么如何执行以下代码
for na in arr_nb_alternative
@show na
for mt in arr_nb_montecarlo
println("...$mt")
append!(df.NbAlternative, ones(Int, nb_simulations)*na)
append!(df.NbMonteCarlo, ones(Int, nb_simulations)*mt)
append!(df.Similarity, compare_smaa(na, nb_criteria, nb_simulations, mt))
end
end
compare\u smaa
返回一个nb\u模拟
长度向量。您不应该做这样的事情,因为这会导致DataFrames.jl中的许多函数停止正常工作。实际上,这样的代码很快就会抛出一个错误,请看,这正是试图修补DataFrames.jl设计中的这个漏洞
您应该做的是使用append将类似数据帧的对象追加到DataFrame
代码>函数(这保证结果具有一致的列长度)或使用push
向数据帧添加一行
现在,类型不稳定的原因是,DataFrame
可以保存任何类型的向量(从技术上讲,列保存在vector{AbstractVector}
中),因此无法在编译时确定给定名称下的向量类型
编辑
您需要的是DataFrames.jl很好地支持的典型场景,我几乎每天都这样做(因为我做了很多模拟)。正如我所指出的,您可以使用push代码>或追加代码>。使用push
添加模拟的单次运行(这不是您的情况,但我添加了它,因为它也是非常常见的):
这就是如何使用append代码>:
for na in arr_nb_alternative
@show na
for mt in arr_nb_montecarlo
println("...$mt")
# here you have to make sure that compare_smaa returns a vector
append!(df, (NbAlternative=ones(Int, nb_simulations)*na,
NbMonteCarlo=ones(Int, nb_simulations)*mt,
Similarity=compare_smaa(na, nb_criteria, nb_simulations, mt)))
end
end
注意,我在这里附加了一个名为tuple的。正如我前面所写的,您可以通过这种方式附加数据帧
或任何类似数据帧的对象。“类似于数据帧的对象”的含义是一类广泛的事物——通常是可以传递给数据帧
构造函数的任何事物(例如,它也可以是命名的双倍的向量
)
注意,append
使用名称匹配将列添加到数据帧
,因此列名必须在目标对象和附加对象之间保持一致
这在推送中是不同的
还允许推送未指定列名的行(在上面的示例中,我显示可以推送元组。感谢您的回答。很抱歉,我仍然不知道我应该怎么做,我把我的问题,这也是它的标题编辑。我应该为每个追加创建一个新的数据帧吗代码>?我已经扩展了答案以匹配编辑后的问题:)。我想您上一个代码示例中的括号太多了,但除此之外,它完全有效,谢谢!固定的。我是从脑子里写的,没有运行它来测试。抱歉。这不是答案,但请注意数组{Int,1}===向量{Int}
,它更短更清晰。@OscarSmith,噢,非常感谢,我不知道!hahaalsoMatrix
是向量{T,2}
@OscarSmith的别名,你是说数组{T,2}?
for na in arr_nb_alternative
@show na
for mt in arr_nb_montecarlo
println("...$mt")
# here you have to make sure that compare_smaa returns a vector
append!(df, (NbAlternative=ones(Int, nb_simulations)*na,
NbMonteCarlo=ones(Int, nb_simulations)*mt,
Similarity=compare_smaa(na, nb_criteria, nb_simulations, mt)))
end
end