Инициализируйте столбец с пропущенными значениями и скопируйте + преобразуйте другой столбец информационного кадра в инициализированный столбец. - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть грязный столбец в файле csv (столбец A кадра данных).

using CSV, DataFrames
df = DataFrame(A = ["1", "3", "-", "4", missing, "9"], B = ["M", "F", "R", "G", "Z", "D"])

Хочу сделать следующее:

  1. Преобразовать целое числоиз строки в число (например, Float64)
  2. Преобразование строки "-" в missing

Стратегия будет заключаться в том, чтобы сначала определить новый вектор-столбец, заполненный пропущенными

df[:C] = fill(missing, size(df)[1])

, а затем выполнить 2 преобразования с помощью циклов for

for i in 1:size(df)[1]
    if df[:A][i] == "-"
        continue
    else
        df[:C][i] = parse(Float64,df[:A][i])
    end
end

Однако, глядя на df[:C], у меня есть столбец, заполненный только отсутствующими.Что я делаю не так?

1 Ответ

0 голосов
/ 16 февраля 2019

Есть несколько проблем с вашим кодом, но сначала позвольте мне показать, как бы я написал это преобразование:

df.C = passmissing(parse).(Float64, replace(df.A, "-"=>missing))

Это не самый эффективный способ сделать это, но просто рассуждать.

Реализация, использующая цикл, может выглядеть следующим образом:

df.C = similar(df.A, Union{Float64, Missing});

for (i, a) in enumerate(df.A)
    if !ismissing(a) && a != "-"
        df.C[i] = parse(Float64, a)
    else
        df.C[i] = missing
    end
end

Обратите внимание, что similar по умолчанию заполнит df.C на missing, так что часть else может быть отброшена,но это поведение не задокументировано, поэтому его безопаснее написать.

Вы также можете использовать понимание:

df. C = [ismissing(a) || a == "-" ? missing : parse(Float64, a) for a in df.A]

Теперь, чтобы исправить свой код, вы можете написать:

# note a different initialization
# in your code df.C allowed only values of Missing type and disallows of Float64 type
df.C = Vector{Union{Float64, Missing}}(missing, size(df, 1))

for i in 1:size(df)[1]
    # note that we need to handle missing value and "=" separately
    if ismissing(df.A[i]) || df.A[i] == "-"
        continue
    else
        df.C[i] = parse(Float64,df.A[i])
    end
end

Наконец, обратите внимание, что для доступа к столбцу во фрейме данных предпочтительно писать df.C, чем df[:C] (в настоящее время оба эквивалентны, но это может измениться в будущем).

...