Julia Dataframes - 使用 eltype Union{Missing, T} 简洁地创建列

cpg*_*pgj 3 dataframe julia dataframes.jl

我正在构建一个数据框,其中对于某些列,创建它们的明显方法涉及多步骤过程。我想用 eltype Union{Missing, T} 惯用且简洁地创建一个列。然后我可以使用多步骤过程填充该列(并在完成后酌情禁止)。最干净的方法是什么?

我想做类似的事情df[!, :col] :: Vector{Union{Int64, Missing}} .= missing但这给了"ArgumentError: column name :col not found in the data frame; ..."

如果我尝试去做df[!, :col] .= fill(missing, nrow(df)) :: Vector{Union{Int64, Missing}},我就会得到"TypeError: in typeassert, expected Vector{Union{Missing, Int64}}, got a value of type Vector{Missing}"

目前我正在做一些丑陋且令人困惑的事情,比如

df[!, :col] .= 0

allowmissing!(df, :col)

df.col .= missing

有什么建议么?我的感觉是,如果我有这个问题,我并不真正理解 DataFrames.jl 中的列类型如何工作的细微差别,即使我一直使用它并且通常没有问题。我搜索了文档,但感觉没有看到任何有助于解决此特定问题的内容,但任何推荐的阅读都将不胜感激。

谢谢!

Bog*_*ski 5

这是一种方法(还有其他选项如何将列添加到数据框,但要使用的关键函数是missings):

\n
julia> using DataFrames\n\njulia> df = DataFrame()\n0\xc3\x970 DataFrame\n\njulia> df.col = missings(Int, 5)\n5-element Vector{Union{Missing, Int64}}:\n missing\n missing\n missing\n missing\n missing\n\njulia> df\n5\xc3\x971 DataFrame\n Row \xe2\x94\x82 col\n     \xe2\x94\x82 Int64?\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 missing\n   2 \xe2\x94\x82 missing\n   3 \xe2\x94\x82 missing\n   4 \xe2\x94\x82 missing\n   5 \xe2\x94\x82 missing\n\njulia> df.other_col = missings(Float64, nrow(df))\n5-element Vector{Union{Missing, Float64}}:\n missing\n missing\n missing\n missing\n missing\n\njulia> df\n5\xc3\x972 DataFrame\n Row \xe2\x94\x82 col      other_col\n     \xe2\x94\x82 Int64?   Float64?\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 missing    missing\n   2 \xe2\x94\x82 missing    missing\n   3 \xe2\x94\x82 missing    missing\n   4 \xe2\x94\x82 missing    missing\n   5 \xe2\x94\x82 missing    missing\n
Run Code Online (Sandbox Code Playgroud)\n

附带说明一下 - 这个问题与 DataFrames.jl 无关,但与 Julia 中向量的创建方式有关。该missings函数在 Missings.jl 包中定义(由 DataFrames.jl 重新导出)。如果您只想使用 Julia Base 功能,那么以下内容将与使用相同missings

\n
julia> Vector{Union{Int, Missing}}(missing, 5)\n5-element Vector{Union{Missing, Int64}}:\n missing\n missing\n missing\n missing\n missing\n
Run Code Online (Sandbox Code Playgroud)\n

(但是,由于它更详细,我通常使用该missings函数)

\n