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

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

我想用DataFrame中的missing替换该值,这样它就不会包含在统计计算或绘图中。创建数据框时,有什么方法可以做到这一点吗?还是可以在创建数据框后完成?

最佳答案

除了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的调整版本。

10-04 21:27
查看更多