如何在Julia数据框中删除/删除空行和NaN行?

时间:2020-07-08 07:08:24

标签: julia julia-dataframe

我有一个包含nothingNaNmissing的df。删除包含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?

1 个答案:

答案 0 :(得分:5)

您可以例如这个:

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应该位于最后,因为否则missingnothing值的检查将失败。

您也可以将其更直接地编写为:

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中,当您看到nothingNaN时,您可能希望以与missing不同的方式处理它们,因为它们很可能表示数据或输入数据中存在错误。处理数据(与missing相对,它表示刚刚未收集数据)。