我有一组来自ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/的天气数据。
数据集包括温度和降雨量等,并使用-9999作为虚拟值来表示缺失数据。
我想在DataFrame中用x.wk_endingdate.AddDays(-6).ToShortDateString()
替换该值,以便它不会包含在统计计算或绘图中。在创建数据帧时,有没有办法可以做到这一点?或者可以在创建数据帧之后完成吗?
答案 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 │