【问题标题】:How to delete the columns of a dataframe that have only positive values in Julia?如何删除 Julia 中只有正值的数据框列?
【发布时间】:2021-08-06 02:38:32
【问题描述】:

我正在与 Julia 合作并尝试编辑 DataFrame。 我的目标是保留至少一个值为

例如使用代码

using DataFrames

data = Dict("A"=>[1,7,2], 
    "B"=>[3,-9,-3], 
    "C"=>[3,0,6], 
    "D"=>[8,4,2], 
    "E"=>[4,3,-4])

df = DataFrame(data)

我得到以下结果

我正在尝试将其转换为以下 DataFrame

有一些选项可以根据条件删除行,但我没有找到任何对列执行相同操作的选项。

有谁知道如何以简单的方式做到这一点?

【问题讨论】:

    标签: dataframe julia


    【解决方案1】:

    有很多方法可以做到这一点,因为 DataFrames 提供了 Julia 基础的全部灵活性,但我认为一个简单且清晰的方法是:

    julia> data[!, any.(<=(0), eachcol(data))]
    3×2 DataFrame
     Row │ B      E     
         │ Int64  Int64 
    ─────┼──────────────
       1 │     3      4
       2 │    -9      3
       3 │    -3     -4
    

    我还要补充一点,您不必创建 Dict 来创建 DataFrame,构造函数与 String / Vector 对可以正常工作:

    julia> data = DataFrame("A"=>[1,7,2], 
               "B"=>[3,-9,-3], 
               "C"=>[3,0,6], 
               "D"=>[8,4,2], 
               "E"=>[4,3,-4])
    3×5 DataFrame
     Row │ A      B      C      D      E     
         │ Int64  Int64  Int64  Int64  Int64 
    ─────┼───────────────────────────────────
       1 │     1      3      3      8      4
       2 │     7     -9      0      4      3
       3 │     2     -3      6      2     -4
    

    【讨论】:

    • 次要评论,他要求
    • 另外,
    • 两者都非常有效 - 已相应编辑,谢谢!
    • 太棒了。但是,您还应该相应地更新输出:) 目前它与 OP 中所需的输出不匹配(缺少 C 列)。
    • 效果很好,非常感谢您快速有效的回复!
    【解决方案2】:

    我会这样做,

    using DataFrames
    data = DataFrame(A = [1, 7, 2], B = [3, -9, -3], C = [3, 0, 6], D = [8, 4, 2], E = [4, 3, -4])
    

    使用数组理解

    data[!, [ any(x -> x ≤ 0, col) for col in eachcol(data) ]]
    

    map

    data[!, map(col -> any(x -> x ≤ 0, col), eachcol(data))]
    

    或在 Nils 的回答中使用广播

    data[!, any.(≤(0), eachcol(data))]
    

    【讨论】:

      【解决方案3】:

      这有点笨拙,但是您可以找到每个元素是否

      julia> relevant_cols = maximum.(eachcol(df .<= 0))
      5-element BitArray{1}:
       0
       1
       1
       0
       1
      
      julia> reduced_df = df[!,relevant_cols]
      3×3 DataFrame
      │ Row │ B     │ C     │ E     │
      │     │ Int64 │ Int64 │ Int64 │
      ├─────┼───────┼───────┼───────┤
      │ 1   │ 3     │ 3     │ 4     │
      │ 2   │ -9    │ 0     │ 3     │
      │ 3   │ -3    │ 6     │ -4    │
      
      

      编辑:使答案与当前版本的 DataFrames 兼容,并删除了以前建议的 filter! 命令作为潜在的解决方案,因为它是基于行而不是基于列的。

      【讨论】:

      • 您使用的是哪个 DataFrames 版本?有一段时间不支持使用单个索引对 DataFrame 进行索引,DataFrame 是二维对象,因此为了与 Julia 基本索引保持一致,必须由 df[rowindex, colindex] 工作。当前版本上的解决方案错误。 filter! 也是一个按行的概念,因此在这种情况下无济于事。
      • 我正在使用v0.21.8,这意味着我急需升级。哎呀!是的,我只是在交叉检查filter! 功能,它确实是逐行的。
      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2016-01-13
      • 2019-06-28
      • 2021-08-23
      • 1970-01-01
      • 2014-02-27
      • 2022-12-22
      相关资源
      最近更新 更多