我试图了解 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)
现在,假设我根据那些A和B列进行计算,这些列生成C带有 DateTime 对象的第三列。但不是为所有行生成 DateTime 对象,它们可能为空。
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)
执行此操作的有效模式是:
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表示该值存在但未知;我不确定哪种情况对您更好)。