在Julia DataFrame中基于多个条件选择列

时间:2019-09-12 13:22:19

标签: dataframe filter julia criteria

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

.as-console-wrapper { max-height: 100% !important; top: 0; }
  

output> MethodError:没有匹配的方法...

### 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)逻辑的使用有关的方法不匹配。我做错了什么?

2 个答案:

答案 0 :(得分:2)

替代实现的一个小示例(也许您会发现查看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, :]

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

答案 1 :(得分:1)

此代码有效:

&
  

输出> [0,10,0]

请注意使用括号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) (arLabels.>=0.2),以及使用(arLabels<0.7).>=语法(这会强制Julia遍历容器/采集)。最后,也是最关键的一点(因为这是大多数人所缺少的部分),请注意使用.<代替.&。点运算符使一切变得不同!