【问题标题】:Julia DataFrame Fill NA with LOCFJulia DataFrame 用 LOCF 填充 NA
【发布时间】:2016-12-17 08:22:59
【问题描述】:

有没有什么快速的方法可以将 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 = 最后一次观察结转

【问题讨论】:

  • result = d[cummax([i*!isna(d[i]) for i=1:length(d)])]

标签: dataframe julia


【解决方案1】:

扩展评论 oneliner,如果我们将 locf 定义为:

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 │

【讨论】:

  • 这个 isna 函数是在哪里定义的?
  • @xgdgsc 这适用于旧版本的 DataFrame。如果isnamissing 是新的NA,那么目前ismissing 可能会接手这项工作
  • 无法在 julia 1.3.1 中找到 cummax。最终使用accumulatelocf(v) = v[accumulate(max, [i*!ismissing(v[i]) for i=1:length(v)])]
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我写了这个:

    这也应该有效,尽管可能需要针对您的具体情况进行调整。这仅考虑数组中的正数。

    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)
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-03-31
        • 1970-01-01
        • 1970-01-01
        • 2019-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-11
        相关资源
        最近更新 更多