Python 加快搜索大熊猫数据帧中最近的上下值

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

我的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_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)