Julia 中没有任何值的 DataFrame 列?

M.E*_*.E. 3 julia

我试图了解 DataFrames 在 Julia 中是如何工作的,但我遇到了困难。

我通常使用 DataFrames——在 Python 中——在每个模拟步骤中添加新列并用值填充每一行。

例如,我有这个包含输入数据的 DataFrame:

using DataFrames

df = DataFrame( A=Int[], B=Int[] )
push!(df, [1, 10])
push!(df, [2, 20])
push!(df, [3, 30])
Run Code Online (Sandbox Code Playgroud)

现在,假设我根据那些AB列进行计算,这些列生成C带有 DateTime 对象的第三列。但不是为所有行生成 DateTime 对象,它们可能为空。

  1. 这个用例在 Julia 中是如何处理的?
  2. 我应该如何创建新的 C 列并在for r in eachrow(df).
# Pseudocode of what I intend to do

df[! :C] .= nothing

for r in eachrow(df)
    if condition
        r.C = mySuperComplexFunctionThatReturnsDateTimeForEachRow()
    else
        r.C = nothing
    end
end
Run Code Online (Sandbox Code Playgroud)

为了给出一个可运行的具体代码,让我们伪造条件和函数:

df[! :C] .= nothing

for r in eachrow(df)
    if r.A == 2
        r.C = Dates.now()
    else
        r.C = nothing
    end
end
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 5

执行此操作的有效模式是:

df.C = f.(df.A, df.B)
Run Code Online (Sandbox Code Playgroud)

wheref是一个函数,它接受标量并基于它们计算输出(即您的模拟代码),然后将您需要从中提取df以执行计算的列传递给它。通过这种方式,Julia 编译器将能够生成快速(类型稳定)的本机代码。

在您的示例中,函数f将是ifelse这样您可以编写:

df.C = ifelse.(df.A .== 2, Dates.now(), nothing)
Run Code Online (Sandbox Code Playgroud)

还要考虑您是否返回nothingor missing(它们在 Julia 中有不同的解释:nothing表示没有值,missing表示该值存在但未知;我不确定哪种情况对您更好)。