【问题标题】:Convert a Julia DataFrame column with String to one with Int and missing values将带有 String 的 Julia DataFrame 列转换为带有 Int 和缺失值的列
【发布时间】:2019-06-20 10:53:35
【问题描述】:

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

我想将 A 列从 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} 类型元素的列。

nothingNothing 类型)和missingMissing 类型)似乎是两种不同的值。

所以我想知道如何使用 missing 值代替 A 列?

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

【问题讨论】:

    标签: dataframe julia missing-data


    【解决方案1】:

    我会做以下事情:

    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,或者在Python 中被视为None,@987654321 @。

    附带说明,Missing 类型有一些 Julia functionalities

    【讨论】:

    • 不确定最后一个代码是否适用于像 df = DataFrame(:A=>["", "2", "3", "-"], :B=>[1.1, 2.2, 3.3, 4.4]) 这样的 DataFrame,其中空字符串应该被视为缺失,但也不能被解析为 Int 的字符串(如 -
    • @scls,是的,你是对的,这是一个过于具体的代码,假设缺失值只是空字符串,我删除了它;)
    • 我想知道是否不应该在 DataFrames.jl 中定义清理函数(或者 tryparse 应该可以选择输出 missing 而不是 nothing
    • 我发现了一种更简单的方法:df.A = replace(df.A, nothing=>missing)
    【解决方案2】:

    missing 替换nothing 可以简单地使用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)
    

    【讨论】:

    猜你喜欢
    • 2019-10-26
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2019-07-17
    • 2018-01-06
    • 2022-10-19
    相关资源
    最近更新 更多