【问题标题】:Selecting Columns Based on Multiple Criteria in a Julia DataFrame在 Julia DataFrame 中根据多个条件选择列
【发布时间】:2020-01-14 09:21:43
【问题描述】:

我需要根据来自数组的多个条件从 Julia 数据框中的单个列中选择值。背景:我正在尝试格式化来自大型 Julia DataFrame 的数据以支持 PCA(主成分分析),因此我首先将原始数据拆分为分析矩阵和标签数组。这是我的代码,到目前为止(不起作用):

### Initialize source dataframe for PCA
dfSource=DataFrame(
    colDataX=[0,5,10,15,5,20,0,5,10,30],
    colDataY=[1,2,3,4,5,6,7,8,9,0],
    colRowLabels=[0.2,0.3,0.5,0.6,0.0,0.1,0.2,0.1,0.8,0.0])
### Extract 1/2 of rows into analytical matrix
matSource=convert(Matrix,DataFrame(dfSource[1:2:end,1:2]))'
###  Extract last column as labels
arLabels=dfSource[1:2:end,3]
###  Select filtered rows
datGet=matSource[:,arLabels>=0.2 & arLabels<0.7][1,:]
print(datGet)

输出> MethodError: 没有方法匹配...

print(datGet) 语句之前的最后一行,我得到一个 MethodError 指示与使用&amp; 逻辑相关的方法不匹配。我做错了什么?

【问题讨论】:

    标签: dataframe filter julia criteria


    【解决方案1】:

    一个替代实现的小例子(也许你会发现看看 DataFrames.jl 内置了什么很有用):

    # avoid materialization if dfSource is large
    dfSourceHalf = @view dfSource[1:2:end, :]
    lazyFilter = Iterators.filter(row -> 0.2 <= row[3] < 0.7, eachrow(dfSourceHalf))
    matFiltered = mapreduce(row -> collect(row[1:2]), hcat, lazyFilter)
    matFiltered[1, :]
    

    (这不是针对速度进行优化的,而是为了展示什么是可能的,但它仍然比您的代码快几倍)

    【讨论】:

      【解决方案2】:

      此代码有效:

      dfSource=DataFrame(
          colDataX=[0,5,10,15,5,20,0,5,10,30],
          colDataY=[1,2,3,4,5,6,7,8,9,0],
          colRowLabels=[0.2,0.3,0.5,0.6,0.0,0.1,0.2,0.1,0.8,0.0])
      
      matSource=convert(Matrix,DataFrame(dfSource[1:2:end,1:2]))'
      
      arLabels=dfSource[1:2:end,3]
      
      datGet=matSource[:,(arLabels.>=0.2) .& (arLabels.<0.7)][1,:]
      print(datGet)
      

      输出> [0,10,0]

      注意使用括号括起来的 (arLabels.&gt;=0.2)(arLabels&lt;0.7),以及使用 .&gt;=.&lt; 语法(这会强制 Julia 遍历容器/集合)。最后,也是最重要的(因为这是大多数人错过的部分),请注意使用 .&amp; 代替 &amp;。点运算符让一切变得不同!

      【讨论】:

      • Julia 支持链式比较,例如 0.2 .&lt;= arLabels .&lt; 0.7,因此您不需要 .&amp;
      • 不错的补充。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      相关资源
      最近更新 更多