Julia Dataframes - 使用 eltype Union{Missing, T} 简洁地创建列
Julia Dataframes - concisely create column with eltype Union{Missing, T}
我正在构建一个数据框,其中对于某些列,创建它们的明显方法涉及一个多步骤过程。我想用 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 中输入列的工作原理的细微差别,即使我一直使用它并且通常没有问题。我已经搜索了文档,但我觉得我没有看到任何有助于解决这个特定问题的内容,但是任何推荐的阅读材料都将不胜感激。
谢谢!
这是一种方法(还有其他选项可以将列添加到数据框,但要使用的关键函数是 missings
):
julia> using DataFrames
julia> df = DataFrame()
0×0 DataFrame
julia> df.col = missings(Int, 5)
5-element Vector{Union{Missing, Int64}}:
missing
missing
missing
missing
missing
julia> df
5×1 DataFrame
Row │ col
│ Int64?
─────┼─────────
1 │ missing
2 │ missing
3 │ missing
4 │ missing
5 │ missing
julia> df.other_col = missings(Float64, nrow(df))
5-element Vector{Union{Missing, Float64}}:
missing
missing
missing
missing
missing
julia> df
5×2 DataFrame
Row │ col other_col
│ Int64? Float64?
─────┼────────────────────
1 │ missing missing
2 │ missing missing
3 │ missing missing
4 │ missing missing
5 │ missing missing
附带说明 - 此问题与 DataFrames.jl 无关,但与 Julia 中向量的一般创建方式有关。 missings
函数在 Missings.jl 包中定义(由 DataFrames.jl 重新导出)。如果您只想使用 Julia Base 功能,那么以下内容与使用 missings
相同:
julia> Vector{Union{Int, Missing}}(missing, 5)
5-element Vector{Union{Missing, Int64}}:
missing
missing
missing
missing
missing
(但是,因为它更冗长,我通常使用 missings
函数)
我正在构建一个数据框,其中对于某些列,创建它们的明显方法涉及一个多步骤过程。我想用 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 中输入列的工作原理的细微差别,即使我一直使用它并且通常没有问题。我已经搜索了文档,但我觉得我没有看到任何有助于解决这个特定问题的内容,但是任何推荐的阅读材料都将不胜感激。
谢谢!
这是一种方法(还有其他选项可以将列添加到数据框,但要使用的关键函数是 missings
):
julia> using DataFrames
julia> df = DataFrame()
0×0 DataFrame
julia> df.col = missings(Int, 5)
5-element Vector{Union{Missing, Int64}}:
missing
missing
missing
missing
missing
julia> df
5×1 DataFrame
Row │ col
│ Int64?
─────┼─────────
1 │ missing
2 │ missing
3 │ missing
4 │ missing
5 │ missing
julia> df.other_col = missings(Float64, nrow(df))
5-element Vector{Union{Missing, Float64}}:
missing
missing
missing
missing
missing
julia> df
5×2 DataFrame
Row │ col other_col
│ Int64? Float64?
─────┼────────────────────
1 │ missing missing
2 │ missing missing
3 │ missing missing
4 │ missing missing
5 │ missing missing
附带说明 - 此问题与 DataFrames.jl 无关,但与 Julia 中向量的一般创建方式有关。 missings
函数在 Missings.jl 包中定义(由 DataFrames.jl 重新导出)。如果您只想使用 Julia Base 功能,那么以下内容与使用 missings
相同:
julia> Vector{Union{Int, Missing}}(missing, 5)
5-element Vector{Union{Missing, Int64}}:
missing
missing
missing
missing
missing
(但是,因为它更冗长,我通常使用 missings
函数)