【问题标题】:How to remove/drop rows of nothing and NaN in Julia dataframe?如何在 Julia 数据框中删除/删除空行和 NaN?
【发布时间】:2020-07-08 07:08:24
【问题描述】:

我有一个包含 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", :])

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

【问题讨论】:

    标签: julia julia-dataframe


    【解决方案1】:

    你可以做例如这个:

    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,这表明数据没有被收集)。

    【讨论】:

    • 是否可以使用列号而不是名称来执行您的建议?例如,df[:, 1] .
    • 是的 - 只使用列号。
    • 谢谢@BogumilKaminski 如果有人正在寻找使用列号的语法:filter( [1]=> x -> !any(f -> f(x), (ismissing, isnothing, isnan)), df)
    • 不用写[1]1就够了
    猜你喜欢
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2021-03-09
    • 2023-02-15
    相关资源
    最近更新 更多