Select 使用多个条件的数据框行的子集
Select subset of rows of dataframe using multiple conditions
我想要 select 满足多行多个条件的数据帧子集。我知道我可以按顺序执行此操作——首先 select 匹配第一个条件的子集,然后匹配第二个条件的子集,等等,但它似乎应该能够在一个步骤中完成.以下似乎应该有效,但没有。显然它在其他语言的 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
这是 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,这在 pandas 和 Python 中的工作方式相同:
>>> df[(df.A < 5) & (df.B == "c")]
A B
1 3 c
2 4 c
我现在和 https://whosebug.com/users/5526072/jwimberley 一样,发生在我从 0.5 更新到 julia 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^chains 的时间)
所以现在查询可能是更好的方法:
# 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 文档中。
我想要 select 满足多行多个条件的数据帧子集。我知道我可以按顺序执行此操作——首先 select 匹配第一个条件的子集,然后匹配第二个条件的子集,等等,但它似乎应该能够在一个步骤中完成.以下似乎应该有效,但没有。显然它在其他语言的 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
这是 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,这在 pandas 和 Python 中的工作方式相同:
>>> df[(df.A < 5) & (df.B == "c")]
A B
1 3 c
2 4 c
我现在和 https://whosebug.com/users/5526072/jwimberley 一样,发生在我从 0.5 更新到 julia 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^chains 的时间) 所以现在查询可能是更好的方法:
# 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 文档中。