Dataframe 有效设置交叉点以获取数据帧中的行
我有一个数据框,其中有3个值与这个问题相关,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
: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
aSet
,我以前的代码运行得非常快。如果你想进一步说明你的答案,我不会标记我的答案。在大约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]]), :]