Julia DataFrame使用LOCF填充NA

时间:2016-12-17 08:23:00

标签: dataframe julia

有没有快速的方法将DataFrame的NA值转换为最后观察到的值?

using DataFrames

d = @data [1,NA,5,NA,NA]
df = DataFrame(d=d)

result = filled_with_locf(df)

expected = [1,1,5,5,5]
  • LOCF =最后一次观察结转

4 个答案:

答案 0 :(得分:2)

如果我们将locf定义为:

,则扩展评论oneliner
locf(v) = v[cummax([i*!isna(v[i]) for i=1:length(v)])]

然后,

nona_df = DataFrame(Any[locf(df[c]) for c in names(df)],names(df))

julia> nona_df
5×1 DataFrames.DataFrame
│ Row │ d │
├─────┼───┤
│ 1   │ 1 │
│ 2   │ 1 │
│ 3   │ 5 │
│ 4   │ 5 │
│ 5   │ 5 │

答案 1 :(得分:1)

如果您是 Julia 的新手并且不明白为什么 Dan Getz's answer 有效,请查看 my explanation 中的 similar thread

答案 2 :(得分:0)

我写了这个:

这应该也可以,但可能需要根据您的具体情况进行调整。这只考虑了数组中的正数。

function locf(x::Array{Float64})
dx = zeros(x)
for i in 2:length(x)-1
    if x[i+1] > 0 && x[i] == 0.0
        dx[i+1] = x[i+1]
    end
        if dx[i] == 0 
            dx[i] = dx[i-1]
        end
    end
    return dx
end

    na_locf = locf(dummy_array)

答案 3 :(得分:0)

为避免在列的第一个值丢失时出现 BoundsError,请在累加函数调用中使用 init=1。

locf(v) = v[accumulate(max, [i* !(ismissing(v[i])|isnan(v[i])) for i in 1:length(v)], init = 1)]