2015-04-02 12 views
6

Chciałbym wybrać podzbiór ramek danych, który spełnia wiele warunków w wielu wierszach. Wiem, że mogę to po kolei - najpierw wybrać podzbiór, który pasuje do pierwszego warunku, potem część tych, które pasują do drugiego, itd., Ale wydaje się, że powinno być to możliwe w jednym kroku. Wygląda na to, że powinno działać, ale nie działa. Wygląda na to, że działa to w innych wersjach językowych DataFrame. jakieś pomysły?Wybierz podzbiór wierszy ramek danych przy użyciu wielu warunków.

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 

Odpowiedz

7

Jest rzeczą Julia, nie tyle rzeczą DataFrame: chcesz & zamiast &&. Na przykład:

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, to działa w ten sam sposób, w pand w Pythonie:

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

Ups, powinienem był to złapać - nawet spojrzałam na powiązane pytania pandy, ale byłam zbytnio przyzwyczajona do pisania "&&" ... Dzięki! – ARM

+0

Czy to się zmieniło? Próbując czegoś podobnego dostaję błąd 'OSTRZEŻENIE: a :: DataArray {$ (Expr (: <:,: Integer))} & b :: DataArray {$ (Expr (: <:,: Integer))} jest przestarzały, zamiast tego użyj &. (a, b). " – jwimberley

0

mam to samo teraz jak https://stackoverflow.com/users/5526072/jwimberley, występujące na moim aktualizacji Julia 0,6 z 0,5, a teraz za pomocą dataframes v 0.10.1.

Aktualizacja: Zrobiłem następujące zmiany naprawić:

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

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

ale to staje się bardzo powolny z długich łańcuchów (czas podjętych \ propto 2^łańcuchy) więc może Zapytanie jest lepszym sposobem teraz:

# 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 

na przykład. To jest szybkie. Jest w dokumentacji DataFrames.

Powiązane problemy