Dataframe 如何有效地使用向量追加数据帧列?

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

使用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}

但是,
@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,噢,非常感谢,我不知道!hahaalso
Matrix
是向量{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