2015-04-02 92 views
6

我想選擇滿足多個行上多個條件的數據框的子集。我知道我可以按順序 - 首先選擇匹配第一個條件的子集,然後選擇匹配第二個條件的那部分,但似乎應該能夠在一個步驟中完成。以下似乎應該工作,但沒有。顯然它在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 

回答

7

這是朱莉婭的事,與其說是一個數據幀的事情:你想&而不是&&。例如:

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:

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

哎呦,我應該自己抓到了 - 我甚至看過相關的熊貓問題,但也習慣於輸入「&&」......謝謝! – ARM 2015-04-02 19:59:14

+0

這個改變了嗎?嘗試類似的東西我得到錯誤'警告:a :: DataArray {$(Expr(:<:,:Integer))}&b :: DataArray {$(Expr(:<:, Integer))}改用&。(a,b) – jwimberley 2017-11-06 20:43:48

0

我有同樣的現在,作爲https://stackoverflow.com/users/5526072/jwimberley,0.5我的更新發生朱莉婭0.6,而現在使用數據框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 ^鏈) 所以也許查詢現在是更好的辦法很慢:

# 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文檔中。