Столбец DataFrame с пустыми значениями в Julia? - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь понять, как DataFrames работают в Джулии, и у меня трудное время.

Обычно я работал с DataFrames - в Python - добавляя новые столбцы на каждом этапе моделирования и заполняя каждую строкузначения.

Например, у меня есть этот DataFrame, который содержит входные данные:

using DataFrames

df = DataFrame( A=Int[], B=Int[] )
push!(df, [1, 10])
push!(df, [2, 20])
push!(df, [3, 30])

Теперь предположим, что я делаю вычисления на основе тех столбцов A и B, которые генерируюттретий столбец C с объектами DateTime.Но объекты DateTime генерируются не для всех строк, они могут быть нулевыми.

  1. Как этот вариант использования обрабатывается в Julia?
  2. Как создать новый столбец C и присвоить значениявнутри for r in eachrow(df)?
# Pseudocode of what I intend to do

df[! :C] .= nothing

for r in eachrow(df)
    if condition
        r.C = mySuperComplexFunctionThatReturnsDateTimeForEachRow()
    else
        r.C = nothing
    end
end

Чтобы дать работоспособный и конкретный код, давайте подставим условие и функцию:

df[! :C] .= nothing

for r in eachrow(df)
    if r.A == 2
        r.C = Dates.now()
    else
        r.C = nothing
    end
end

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019

Эффективный шаблон для этого:

df.C = f.(df.A, df.B)

, где f - это функция, которая принимает скаляры и вычисляет выходные данные на их основе (т. Е. Код моделирования), и вы передаете ему столбцывам нужно извлечь из df для выполнения расчетов.Таким образом, компилятор Julia сможет генерировать быстрый (стабильный по типу) собственный код.

В вашем примере функция f будет ifelse, поэтому вы можете написать:

df.C = ifelse.(df.A .== 2, Dates.now(), nothing)

Также рассмотрите, вернетесь ли вы nothing или missing (они имеют другую интерпретацию в Юлии: nothing означает отсутствие значения, а missing означает, что значение присутствует, но не известно; я не знаюуверен, что было бы лучше в вашем случае).

2 голосов
/ 19 сентября 2019

Если вы инициализируете столбец с df[!, :C] .= nothing, он имеет тип элемента Nothing.При записи DateTime s в этот столбец Джулия пытается преобразовать их в Nothing и не удается.Я не уверен, является ли это наиболее эффективным или рекомендуемым решением, но если вы инициализируете столбец как объединение DateTime и Nothing

df[!, :C] = Vector{Union{DateTime, Nothing}}(nothing, size(df, 1))

, ваш пример должен работать.

...