使用多个条件选择数据帧行的子集

时间:2015-04-02 19:37:57

标签: dataframe julia

我想选择满足多行多个条件的数据帧的子集。我知道我可以按顺序 - 首先选择匹配第一个条件的子集,然后选择匹配第二个条件的那个,等等,但似乎它应该能够在一个步骤中完成。以下似乎应该有效,但没有。显然它在其他语言的DataFrame实现中确实如此。有什么想法吗?

using DataFrames
df = DataFrame()
df[:A]=[ 1, 3, 4, 7, 9]
df[:B]=[ "a", "c", "c", "D", "c"]
df[(df[:A].<5)&&(df[:B].=="c"),:] 

type: non-boolean (DataArray{Bool,1}) used in boolean context
while loading In[18], in expression starting on line 5

2 个答案:

答案 0 :(得分:9)

这是Julia的事情,而不是DataFrame的事情:你需要&而不是&&。例如:

julia> [true, true] && [false, true]
ERROR: TypeError: non-boolean (Array{Bool,1}) used in boolean context

julia> [true, true] & [false, true]
2-element Array{Bool,1}:
 false
  true

julia> df[(df[:A].<5)&(df[:B].=="c"),:]
2x2 DataFrames.DataFrame
| Row | A | B   |
|-----|---|-----|
| 1   | 3 | "c" |
| 2   | 4 | "c" |

FWIW,这在Python中的pandas中的工作方式相同:

>>> df[(df.A < 5) & (df.B == "c")]
   A  B
1  3  c
2  4  c

答案 1 :(得分:0)

我现在和https://stackoverflow.com/users/5526072/jwimberley一样,发生在从julia 0.6到0.5的更新中,现在使用数据帧v 0.10.1。

更新:我做了以下修改:

r[(r[:l] .== l) & (r[:w] .== w), :] # julia 0.5

r[.&(r[:l] .== l, r[:w] .== w), :] # julia 0.6

但是长链会变得非常慢(时间需要\ propto 2 ^ chain) 所以也许Query现在是更好的方法:

# r is a dataframe
using Query
q1 = @from i in r begin
    @where i.l == l && i.w == w && i.nl == nl && i.lt == lt && 
    i.vz == vz && i.vw == vw && i.vδ == vδ && 
    i.ζx == ζx && i.ζy == ζy && i.ζδx == ζδx
    @select {absu=i.absu, i.dBU}
    @collect DataFrame
end
例如,

。这很快。它位于DataFrames文档中。