4

我有一个 df ,其中包含nothing,NaNmissing. 删除包含missing我可以使用的行dropmissing。有什么方法可以处理NaNnothing吗?

样本df:

│ Row │ x       │ y    │
│     │ Union…? │ Char │
├─────┼─────────┼──────┤
│ 1   │ 1.0     │ 'a'  │
│ 2   │ missing │ 'b'  │
│ 3   │ 3.0     │ 'c'  │
│ 4   │         │ 'd'  │
│ 5   │ 5.0     │ 'e'  │
│ 6   │ NaN     │ 'f'  │

预期输出:

│ Row │ x   │ y    │
│     │ Any │ Char │
├─────┼─────┼──────┤
│ 1   │ 1.0 │ 'a'  │
│ 2   │ 3.0 │ 'c'  │
│ 3   │ 5.0 │ 'e'  │

到目前为止我所做的尝试,根据我在 Julia 的知识,我尝试了这个,

df.x = replace(df.x, NaN=>"something", missing=>"something", nothing=>"something")
print(df[df."x".!="something", :])

我的代码按预期工作。我觉得这是解决这个问题的无效方法。是否有任何单独的方法来处理空和 NaN?

4

1 回答 1

6

你可以这样做:

julia> df = DataFrame(x=[1,missing,3,nothing,5,NaN], y='a':'f')
6×2 DataFrame
│ Row │ x       │ y    │
│     │ Union…? │ Char │
├─────┼─────────┼──────┤
│ 1   │ 1.0     │ 'a'  │
│ 2   │ missing │ 'b'  │
│ 3   │ 3.0     │ 'c'  │
│ 4   │         │ 'd'  │
│ 5   │ 5.0     │ 'e'  │
│ 6   │ NaN     │ 'f'  │

julia> filter(:x => x -> !any(f -> f(x), (ismissing, isnothing, isnan)), df)
3×2 DataFrame
│ Row │ x       │ y    │
│     │ Union…? │ Char │
├─────┼─────────┼──────┤
│ 1   │ 1.0     │ 'a'  │
│ 2   │ 3.0     │ 'c'  │
│ 3   │ 5.0     │ 'e'  │

请注意,这里检查的顺序很重要,isnan应该是最后一个,因为否则此检查将失败 for missingor nothingvalue。

你也可以更直接地把它写成:

julia> filter(:x => x -> !(ismissing(x) || isnothing(x) || isnan(x)), df)
3×2 DataFrame
│ Row │ x       │ y    │
│     │ Union…? │ Char │
├─────┼─────────┼──────┤
│ 1   │ 1.0     │ 'a'  │
│ 2   │ 3.0     │ 'c'  │
│ 3   │ 5.0     │ 'e'  │

但我觉得带有的示例any更具可扩展性(然后您可以存储谓词列表以检查变量)。

DataFrames.jl 中仅提供删除函数的原因missing是,这通常被认为是有效但可取的,可以在数据科学管道中删除值。

通常在 Julia 中,当您看到nothing或者NaN您可能希望以不同的方式处理它们时missing,它们很可能表明数据或数据处理中存在一些错误(而不是missing那些表明数据没有被收集的信号)。

于 2020-07-08T07:39:25.703 回答