Dataframe 如何用Julia数据帧中缺少的值替换伪值?

Dataframe 如何用Julia数据帧中缺少的值替换伪值?,dataframe,julia,Dataframe,Julia,我有一组来自英国的天气数据 数据集包括温度和降雨量等,并使用-9999作为虚拟值来表示缺少的数据 我想在数据帧中将该值替换为缺失,这样它就不会包含在统计计算或绘图中。在创建数据帧时,有没有办法做到这一点?或者可以在创建数据帧后执行此操作?以下示例定义了一个函数(名为val2missing),用缺失的替换指定值,然后使用广播符号应用此函数。该示例首先生成一个带有9999.0的随机数据集(用于模拟天气数据)(该数据位于df)。然后,它使用df中的缺失值创建df2: julia> using D

我有一组来自英国的天气数据

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


我想在数据帧中将该值替换为
缺失
,这样它就不会包含在统计计算或绘图中。在创建数据帧时,有没有办法做到这一点?或者可以在创建数据帧后执行此操作?

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

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  │
julia>使用数据帧、丢失
julia>df=DataFrame(x=rand(10),y=[rand()val2missing(v,mv)=mv==v?缺少:v
val2missing(带1方法的通用函数)
julia>df2=DataFrame(x=df[:x],y=val2missing.(df[:y],9999.0))
10×2数据帧。数据帧
│ 一行│ x│ Y│
├─────┼──────────┼───────────┤
│ 1.│ 0.926893│ 0.9355│
│ 2.│ 0.961057│ 丢失的│
│ 3.│ 0.308849│ 丢失的│
│ 4.│ 0.936876│ 0.303936│
│ 5.│ 0.541762│ 0.5957│
│ 6.│ 0.953278│ 丢失的│
│ 7.│ 0.987931│ 丢失的│
│ 8.│ 0.904365│ 0.0227427│
│ 9│ 0.640827│ 0.960697│
│ 10│ 0.66238│ 0.769464│

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

使用
recode
功能 我用丹的例子:

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 │
创建
数据帧时检测
缺失
s
这里它取决于您用来加载数据的包。例如,如果您使用CSV.jl,您可以添加
null=“-9999”
关键字参数到
CSV。阅读
。在更复杂的情况下,您可以使用
转换
关键字参数,例如,使用Dan在那里提出的调整版
val2missing

BogumiłKamiński我正在使用您最近的教程学习数据帧。感谢您这么做。数据采用固定宽度格式,应用程序显然,CSV.jl中没有用于该格式的函数。也许您可以对此进行补救。这里有一个示例数据文件,我编写了一个函数将fwf文件加载到数据帧中。我的函数在这里,我使用了您的colwise/recode建议。再次感谢。现在,我如何将您的答案标记为已接受?因为您已经手动计算了列位置probably没有什么需要改进的(可能是代码清理-例如,将列名、宽度和解析器函数保留在一个数组中)。您可以使用我的软件包中的
scan
函数自动检测列,但您已经这样做了。有一个警告:您的代码适用于ASCII文本(幸运的是您有ASCII数据),但它在通用UTF-8文本上会失败,但这是一个单独的问题(FWF.jl将处理此问题)。若要将答案标记为已接受,您可以单击我的答案旁边的复选标记。自述文件中给出了列宽,因此很容易将列宽放入read__dly.jl代码中。此数据集不存在UTF-8文本问题,但我将研究FWF.jl以了解如何将其应用于其他数据。再次感谢。请继续与Julia!FW合作F.jl现在是WIP,只在Julia 0.7上工作(0.7中重新设计了字符串基础结构,这是向后不兼容的)。关键问题是UTF-8需要小心,因为在这种情况下应该使用字符索引而不是字节索引的跳转-这就是
nextind
的设计目的。非常好。我将不得不等到我的发行版(Fedora)的软件存储库中提供了Julia 0.7但仔细想想,我感兴趣的领域,天气和气候的数据可能是ascii格式的。
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 │