Dataframe 有效设置交叉点以获取数据帧中的行

Dataframe 有效设置交叉点以获取数据帧中的行,dataframe,julia,Dataframe,Julia,我有一个数据框,其中有3个值与这个问题相关,:ID,:Position,:Probability。每行都是唯一的,但多行可能具有相同的ID。我想做的是获取位置的某个值的所有行,这些行与概率高于不同位置某个值的任何行共享ID 例如,假设我有以下数据帧(df): 如果我将阈值设置为0.8,我希望最后得到:Position==“first”的所有行,如果:ID具有:Position==“last”&&:Probability>0.8。换句话说,我想要第5行,因为第6行有一个:Probability>0

我有一个数据框,其中有3个值与这个问题相关,
:ID
:Position
:Probability
。每行都是唯一的,但多行可能具有相同的
ID
。我想做的是获取
位置的某个值的所有行,这些行与
概率高于不同位置某个值的任何行共享
ID

例如,假设我有以下数据帧(df):

如果我将阈值设置为
0.8
,我希望最后得到
:Position==“first”
的所有行,如果
:ID
具有
:Position==“last”&&:Probability>0.8
。换句话说,我想要第5行,因为第6行有一个
:Probability>0.8
,而不是第1行,因为第2行没有

要检查阈值的行并不总是跟随我要保留的行。并非所有
:Position==“first”
的行都有一行要检查,但最多只有一行

我试图解决这个问题的方法是,以
概率>0.8的
最后一个
位置中的所有
ID
创建一个向量,然后尝试使用
in()
对数据帧进行子集。所以

firsts = df[df[:Position] .== "first", :]
lasts = df[df[:Position] .== "last", :]
meetsthreshold = lasts[lasts[:Probability] .> 0.8, :ID]

final = firsts[[in(i, meetsthreshold) for i in firsts[:ID]], :]

我用超短向量
ID
s对此进行了测试,它可以正常工作,但它在我的实际数据上严重滞后(其中
length(meetsthreshold)
is>100k)。我想我想要的基本上是一个集合交集,如果我用
ID
s(例如
intersect(set(firsts[:ID]),set(meetsthreshold))
)来做,它基本上是即时的。有没有一种方法可以与数据帧进行集合交集,这样我就可以实际获取行?

我觉得自己有点像个白痴-解决方案就是使用集合而不是向量来搜索。例如:

firsts = df[df[:Position] .== "first", :]
lasts = df[df[:Position] .== "last", :]
meetsthreshold = Set(lasts[lasts[:Probability] .> 0.8, :ID])

final = firsts[Vector{Bool}([in(i, meetsthreshold) for i in firsts[:ID]]), :]

跑了约1秒

我的提示是:通过(g->maximum(g[:Probability])>0.9?g[g[:Position]。==“first”,:]:DataFrame(),df,:ID)
。但是很乱。看看
by
groupby
。有趣的想法-我用
by
写了一些东西,但我不太懂你写的东西的语法。。。这是一个精简的if-else语句,对吗?是的。它是
if
语句的简写。你试过运行它吗?是的-它正在运行。。。大约5分钟了。看看下面我的答案——如果我把
meetsthreshold
a
Set
,我以前的代码运行得非常快。如果你想进一步说明你的答案,我不会标记我的答案。在大约10分钟后杀死它…因为已经6个月没有其他答案了,我继续标记这个答案。
firsts = df[df[:Position] .== "first", :]
lasts = df[df[:Position] .== "last", :]
meetsthreshold = Set(lasts[lasts[:Probability] .> 0.8, :ID])

final = firsts[Vector{Bool}([in(i, meetsthreshold) for i in firsts[:ID]]), :]