使用多个值过滤数据帧

问题描述 投票:0回答:2

如标题所示,我有一个数据框,我想过滤(保留)其中

id
变量为
1
2
的行。

一个例子:

using DataFrames

# example data set
df1 = DataFrame(id = repeat(1:3, 3),
name = repeat(["bob", "jane", "steve"], inner = 3))

# filtering based on a single id - works fine 
kp_id = 1
df1[df1.id .== 1, :]

# filter on multiple id's - my attempt returns an empty dataframe
kp_id = (1,2)
df1[df1.id .== in(df1.id, kp_id), :]

如有任何建议,我们将不胜感激。

dataframe filter julia
2个回答
2
投票

归根结底是编写一个布尔表达式来生成所需的位向量。当您处理此问题时,请先跳过索引并继续处理

df1.id .== 1

那么 Julia 中一个有用的工具就是首先考虑单个案例:

julia> in(1, (1,2))
true
julia> in(3, (1,2))
false

到目前为止一切顺利!让我们广播这个,但只在第一个参数上,所以我们用 Ref 来保护第二个参数

julia> in.(df1.id, Ref((1,2)))
9-element BitVector:
 1
 1
 0
 1
 1
 0
 1
 1
 0

因此

df1[in.(df1.id, Ref(kp_id)), :]

会起作用的。


2
投票

您可能更喜欢

filter
函数,因为它更具可读性:

julia> filter(:id => in((1, 2)), df1)
6×2 DataFrame
 Row │ id     name
     │ Int64  String
─────┼───────────────
   1 │     1  bob
   2 │     2  bob
   3 │     1  jane
   4 │     2  jane
   5 │     1  steve
   6 │     2  steve

如果你想使用索引,你可以写:

julia> df1[in((1, 2)).(df1.id), :]
6×2 DataFrame
 Row │ id     name
     │ Int64  String
─────┼───────────────
   1 │     1  bob
   2 │     2  bob
   3 │     1  jane
   4 │     2  jane
   5 │     1  steve
   6 │     2  steve

这两种语法都利用了以下事实:

in((1, 2))
创建了一个新函数来检查其参数是否在
(1, 2)
中。

© www.soinside.com 2019 - 2024. All rights reserved.