Python 加快搜索大熊猫数据帧中最近的上下值
我的dataframe与下面的示例类似(只是有更多的条目)。我想为每个组获得给定值的最接近的上下数字Python 加快搜索大熊猫数据帧中最近的上下值,python,pandas,dataframe,Python,Pandas,Dataframe,我的dataframe与下面的示例类似(只是有更多的条目)。我想为每个组获得给定值的最接近的上下数字 a b 600 10 600 12 600 15 600 17 700 8 700 11 700 19 例如,值为13。我想获得一个新的数据帧,类似于: a b 600 12 600 15 700 11 700 19 我已经在使用groupby中尝试了来自Ivo Merchiers的解决方案,并应用于为不同的组运行它 def find_neighb
a b
600 10
600 12
600 15
600 17
700 8
700 11
700 19
例如,值为13。我想获得一个新的数据帧,类似于:
a b
600 12
600 15
700 11
700 19
我已经在使用groupby中尝试了来自Ivo Merchiers的解决方案,并应用于为不同的组运行它
def find_neighbours(value):
exactmatch=df[df.num==value]
if !exactmatch.empty:
return exactmatch.index
else:
lowerneighbour_ind = df[df.num<value].num.idxmax()
upperneighbour_ind = df[df.num>value].num.idxmin()
return [lowerneighbour_ind, upperneighbour_ind]
df=df.groupby('a').apply(find_neighbours, 13)
这方面的13条线索:
a b
600 12
600 15
700 11
700 19
900 12
900 14
900 14
谢谢你的帮助 是的,我们可以加快速度
v=13
s=(df.b-v)
t=s.abs().groupby([df.a,np.sign(s)]).transform('min')
df1=df.loc[s.abs()==t]
df1=df1[df1.b.sub(v).groupby(df.a).transform('nunique')>1]
df1
Out[102]:
a b
1 600 12
2 600 15
5 700 11
6 700 19
9 900 12
10 900 14
11 900 14
试试这个
def neighbours(x):
d = (df.b-x)
return df.loc[[d[d==d[d>0].min()].index[0], d[d==d[d<0].max()].index[0]]]
neighbours(13)
def邻居(x):
d=(df.b-x)
返回df.loc[[d[d==d[d>0].min()].index[0],d[d==d[D谢谢。这显然比我以前的方法快。你知道如何实现我的编辑吗?当只给出一个最近的数字时,有没有办法忽略这些行?就像我的示例中a列中的值800?没有较低的值,因此我还想排除较高的值。效果几乎完美。1 minor问题。如果再次将第7行(800,14)添加到表中。虽然缺少较低的值,但代码返回这几行。@mettwurstolaf ok,我认为use nunique应该可以`
def neighbours(x):
d = (df.b-x)
return df.loc[[d[d==d[d>0].min()].index[0], d[d==d[d<0].max()].index[0]]]
neighbours(13)