将具有String的Julia DataFrame列转换为具有Int和缺少值的列

时间:2019-06-20 10:53:35

标签: dataframe julia missing-data

我需要转换以下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列?

我还想知道missingnothing是否会导致不同的性能。

2 个答案:

答案 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)