我有一组来自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
的调整版本。