我需要转换以下DataFrame
julia> df = DataFrame(:A=>["", "2", "3"], :B=>[1.1, 2.2, 3.3])
看起来像
3×2 DataFrame
│ Row │ A │ B │
│ │ String │ Float64 │
├─────┼────────┼─────────┤
│ 1 │ │ 1.1 │
│ 2 │ 2 │ 2.2 │
│ 3 │ 3 │ 3.3 │
我想将Array{String,1}
的一列转换为缺少值的Int
数组。
我尝试过
julia> df.A = tryparse.(Int, df.A)
3-element Array{Union{Nothing, Int64},1}:
nothing
2
3
julia> df
3×2 DataFrame
│ Row │ A │ B │
│ │ Union… │ Float64 │
├─────┼────────┼─────────┤
│ 1 │ │ 1.1 │
│ 2 │ 2 │ 2.2 │
│ 3 │ 3 │ 3.3 │
julia> eltype(df.A)
Union{Nothing, Int64}
但是我得到的列的元素类型为Union{Nothing, Int64}
。
nothing
(类型Nothing
)和missing
(类型Missing
)似乎是两种不同的值。
所以我想知道如何用missing
值来代替A列?
我还想知道missing
和nothing
是否会导致不同的性能。
答案 0 :(得分:2)
我将执行以下操作:
julia> df.A = map(x->begin val = tryparse(Int, x)
ifelse(typeof(val) == Nothing, missing, val)
end, df.A)
3-element Array{Union{Missing, Int64},1}:
missing
2
3
julia> df
3×2 DataFrame
│ Row │ A │ B │
│ │ Int64⍰ │ Float64 │
├─────┼─────────┼─────────┤
│ 1 │ missing │ 1.1 │
│ 2 │ 2 │ 2.2 │
│ 3 │ 3 │ 3.3 │
我认为missing
更适合于确实具有missing
值而不是nothing
的数据帧,因为后者在C中更被视为void
,或者None
在Python中,see here。
请注意,Missing
类型有一些Julia functionalities。
答案 1 :(得分:1)
使用nothing
替换missing
来替换replace
:
julia> df.A = replace(df.A, nothing=>missing)
3-element Array{Union{Missing, Int64},1}:
missing
2
3
julia> df
3×2 DataFrame
│ Row │ A │ B │
│ │ Int64⍰ │ Float64 │
├─────┼─────────┼─────────┤
│ 1 │ missing │ 1.1 │
│ 2 │ 2 │ 2.2 │
│ 3 │ 3 │ 3.3 │
另一种解决方案是使用定义如下的tryparsem
函数
tryparsem(T, str) = something(tryparse(T, str), missing)
并像使用它
julia> df = DataFrame(:A=>["", "2", "3"], :B=>[1.1, 2.2, 3.3])
julia> df.A = tryparsem.(Int, df.A)