Как пропустить пропущенные значения при преобразовании DataFrame в Julia - PullRequest
3 голосов
/ 09 мая 2019

Я хотел бы преобразовать каждый элемент в столбце в Julia DataFrames.DataFrame, но при этом пропустить пропущенные значения (пусть они остаются в таблице без изменений).

В качестве простого примера, мы могли бы сделать это следующим образом:

using DataFrames, DataFramesMeta

@linq DataFrame(mode=[1,2,missing]) |>
transform(
    mode = map(x->(if x === missing missing elseif x in ([0:5...]) x+1 else missing end), :mode)
)

Но это выглядит более или менее загроможденным. Будут ли более элегантные или лаконичные способы?

Я прочитал документы Query.jl и DataFramesMeta.jl в надежде найти метод, с помощью которого мне не придется кодировать, пропуская пропущенные значения явно.

EDIT: Я думаю, что следующее - лучшее, что я могу придумать:

using DataFrames, DataFramesMeta, DataValues

skipmap(f, c) = map(x->(if x===missing missing else f(x) end), c)

@linq DataFrame(mode=[1,2,missing]) |>
transform(
    mode = skipmap(x->if x in ([0:5...]) x+1 else x end, :mode)
)

Я думаю, было бы здорово, если бы map () расширялся таким образом, чтобы он принимал третий параметр y (следовательно, map (f, c, y)), и сохранял бы эти элементы в массиве без изменений, если они принадлежат y.

1 Ответ

4 голосов
/ 09 мая 2019

passmissing, который экспортируется DataFrames.jl, делает то, что вы хотите. Например, вы можете использовать такой однострочник:

julia> passmissing(x -> x + (x in 0:5)).([1,2,missing,4,5,6])
6-element Array{Union{Missing, Int64},1}:
 2
 3
  missing
 5
 6
 6

дополнительно вы можете использовать трансляцию, так как функции + и in неявно возвращают missing, если вы передаете их missing, например ::

julia> x = [1,2,missing,4,5,6]
6-element Array{Union{Missing, Int64},1}:
 1
 2
  missing
 4
 5
 6

julia> x .+ in.(x, Ref(0:5))
6-element Array{Union{Missing, Int64},1}:
 2
 3
  missing
 5
 6
 6

или

julia> (v -> v + in(v, 0:5)).(x)
6-element Array{Union{Missing, Int64},1}:
 2
 3
  missing
 5
 6
 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...