如何在Julia Dataframes中替换丢失的虚拟值?

时间:2018-02-01 02:21:28

标签: dataframe julia

我有一组来自ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/的天气数据。

数据集包括温度和降雨量等,并使用-9999作为虚拟值来表示缺失数据。

我想在DataFrame中用x.wk_endingdate.AddDays(-6).ToShortDateString() 替换该值,以便它不会包含在统计计算或绘图中。在创建数据帧时,有没有办法可以做到这一点?或者可以在创建数据帧之后完成吗?

2 个答案:

答案 0 :(得分:5)

除了Dan Getz提出的建议外,还有两个选择:

使用recode函数

我正在使用Dan的例子:

julia> df = DataFrame(x=rand(10),y=[rand()<0.3 ? 9999.0 : rand() for i=1:10])
10×2 DataFrames.DataFrame
│ Row │ x         │ y        │
├─────┼───────────┼──────────┤
│ 1   │ 0.856388  │ 0.322763 │
│ 2   │ 0.360254  │ 9999.0   │
│ 3   │ 0.229875  │ 0.906697 │
│ 4   │ 0.275965  │ 0.485042 │
│ 5   │ 0.126336  │ 0.205509 │
│ 6   │ 0.879974  │ 0.752962 │
│ 7   │ 0.0518579 │ 9999.0   │
│ 8   │ 0.512231  │ 0.759513 │
│ 9   │ 0.309586  │ 9999.0   │
│ 10  │ 0.616471  │ 0.978771 │

julia> df[:y] = recode(df[:y], 9999.0=>missing)
10-element Array{Union{Float64, Missings.Missing},1}:
 0.322763
  missing
 0.906697
 0.485042
 0.205509
 0.752962
  missing
 0.759513
  missing
 0.978771

julia> df
10×2 DataFrames.DataFrame
│ Row │ x         │ y        │
├─────┼───────────┼──────────┤
│ 1   │ 0.856388  │ 0.322763 │
│ 2   │ 0.360254  │ missing  │
│ 3   │ 0.229875  │ 0.906697 │
│ 4   │ 0.275965  │ 0.485042 │
│ 5   │ 0.126336  │ 0.205509 │
│ 6   │ 0.879974  │ 0.752962 │
│ 7   │ 0.0518579 │ missing  │
│ 8   │ 0.512231  │ 0.759513 │
│ 9   │ 0.309586  │ missing  │
│ 10  │ 0.616471  │ 0.978771 │

此外,如果您想将整个DataFrame(所有列)重新编码为新数据框,您可以使用colwise

julia> DataFrame(colwise(x -> recode(x, 9999.0=>missing), df), names(df))
10×2 DataFrames.DataFrame
│ Row │ x         │ y        │
├─────┼───────────┼──────────┤
│ 1   │ 0.856388  │ 0.322763 │
│ 2   │ 0.360254  │ missing  │
│ 3   │ 0.229875  │ 0.906697 │
│ 4   │ 0.275965  │ 0.485042 │
│ 5   │ 0.126336  │ 0.205509 │
│ 6   │ 0.879974  │ 0.752962 │
│ 7   │ 0.0518579 │ missing  │
│ 8   │ 0.512231  │ 0.759513 │
│ 9   │ 0.309586  │ missing  │
│ 10  │ 0.616471  │ 0.978771 │

在创建missing

时检测DataFrame

这取决于您用来加载数据的包。例如,如果您使用 CSV.jl ,则可以将null="-9999"关键字参数添加到CSV.read。在更复杂的情况下,您可以使用transforms关键字参数,例如使用Dan在那里提出的val2missing的调整版本。

答案 1 :(得分:0)

以下示例定义了一个函数(名为val2missing),用missing替换指定的值,然后使用.广播符号应用此函数。该示例首先使用9999.0生成随机数据集(以模拟天气数据)(此数据位于df)。然后,它会使用df2中的missing值创建df

julia> using DataFrames, Missings

julia> df = DataFrame(x=rand(10),y=[rand()<0.3 ? 9999.0 : rand() for i=1:10])
10×2 DataFrames.DataFrame
│ Row │ x        │ y         │
├─────┼──────────┼───────────┤
│ 1   │ 0.926893 │ 0.9355    │
│ 2   │ 0.961057 │ 9999.0    │
│ 3   │ 0.308849 │ 9999.0    │
│ 4   │ 0.936876 │ 0.303936  │
│ 5   │ 0.541762 │ 0.5957    │
│ 6   │ 0.953278 │ 9999.0    │
│ 7   │ 0.987931 │ 9999.0    │
│ 8   │ 0.904365 │ 0.0227427 │
│ 9   │ 0.640827 │ 0.960697  │
│ 10  │ 0.66238  │ 0.769464  │

julia> val2missing(v,mv) = mv == v ? missing : v
val2missing (generic function with 1 method)

julia> df2 = DataFrame(x=df[:x], y=val2missing.(df[:y],9999.0))
10×2 DataFrames.DataFrame
│ Row │ x        │ y         │
├─────┼──────────┼───────────┤
│ 1   │ 0.926893 │ 0.9355    │
│ 2   │ 0.961057 │ missing   │
│ 3   │ 0.308849 │ missing   │
│ 4   │ 0.936876 │ 0.303936  │
│ 5   │ 0.541762 │ 0.5957    │
│ 6   │ 0.953278 │ missing   │
│ 7   │ 0.987931 │ missing   │
│ 8   │ 0.904365 │ 0.0227427 │
│ 9   │ 0.640827 │ 0.960697  │
│ 10  │ 0.66238  │ 0.769464  │