如何删除/删除Julia dataframe中的nothing和NaN行?

如何删除/删除Julia dataframe中的nothing和NaN行?,julia,julia-dataframe,Julia,Julia Dataframe,我有一个df,它包含,无,NaN和缺失。要删除包含缺失的行,我可以使用dropmissing。有什么方法可以处理NaN和nothing 样本df: │ Row │ x │ y │ │ │ Union…? │ Char │ ├─────┼─────────┼──────┤ │ 1 │ 1.0 │ 'a' │ │ 2 │ missing │ 'b' │ │ 3 │ 3.0 │ 'c' │ │ 4 │ │ 'd' │ │

我有一个df,它包含,
NaN
缺失
。要删除包含
缺失的行
,我可以使用
dropmissing
。有什么方法可以处理
NaN
nothing

样本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", :])
我的代码按预期工作。我觉得这是解决这个问题的无效方法。 是否有单独的方法来处理nothing和NaN?

您可以这样做,例如:

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
应该是最后一个,否则该检查将因
缺失
值而失败

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

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中只提供了一个用于删除
缺失的
函数的原因是,这通常被认为是数据科学管道中删除值的有效但可取的方法

通常在Julia中,当您看到
nothing
NaN
时,您可能希望以与
missing
不同的方式处理它们,因为它们最有可能表明数据或数据处理中存在错误(而不是
missing
表明数据未收集)