Преобразовать столбец Julia DataFrame со строкой в ​​столбец с Int и пропущенными значениями - PullRequest
1 голос
/ 20 июня 2019

Мне нужно преобразовать следующее 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?

IТакже интересно, если missing и nothing приводят к разной производительности.

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Я бы сделал следующее:

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, потому что последнийбольше рассматривается как void в C или None в Python, см. здесь .

В качестве примечания, тип Missing имеет некоторые функции Джулии .

1 голос
/ 20 июня 2019

Заменить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...