Python 如何为列中的每个元素在另一列中查找最近的元素?

Python 如何为列中的每个元素在另一列中查找最近的元素?,python,pandas,Python,Pandas,情况如下 我有两个数据帧: df1,其中包含一列“p1”,包含1895行范围为2.805到3.035的随机数(以下是前20行): df2,它包含两列,“p2”和“h” 其目的是首先循环通过df1中的所有行,并在p2中为每一行找到最近的元素。e、 g.对于p1[0]=2.910,最接近的元素是p2[2]=2.9 然后,如果这两个值相同,则该行的输出为h 否则,输出是h之前和后续值的平均值 回到我们的示例,p1[0]的输出因此应该是(h[1]+h[3])/2 我希望这一切都有意义,这是我

情况如下

我有两个数据帧:

  • df1,其中包含一列“p1”,包含1895行范围为2.805到3.035的随机数(以下是前20行):
  • df2,它包含两列,“p2”“h”
其目的是首先循环通过df1中的所有行,并在p2中为每一行找到最近的元素。e、 g.对于
p1[0]=2.910
,最接近的元素是
p2[2]=2.9

  • 然后,如果这两个值相同,则该行的输出为h
  • 否则,输出是h之前和后续值的平均值
回到我们的示例,
p1[0]
的输出因此应该是
(h[1]+h[3])/2

我希望这一切都有意义,这是我在这里的第一个问题:)。
谢谢

这是
merge\u asof
的用法,请注意
allow\u exact\u matches=True
默认为True,例如,在这种情况下,2.9最接近为2.9

df1=df1.sort_values('p1')
s1=pd.merge_asof(df1,df2,left_on='p1',right_on='p2',direction='backward')
s2=pd.merge_asof(df1,df2,left_on='p1',right_on='p2',direction='forward')
df1['Value']=(s1.h+s2.h)/2

numpy的另一个解决方案:

import numpy as np

# Generate some test data
x1 = np.random.randint(0,100,10)
x2 = np.vstack([np.random.randint(0,100,10),np.random.normal(0,1,10)]).T

# Repeat the two vectors
X1 = np.tile(x1,(len(x2),1))
X2 = np.tile(x2[:,0],(len(x1),1))
distance = np.abs(X1 - X2.T)
closest_idx = np.argmin(distance,axis=0)

print(x2[closest_idx,1])

非常感谢,您的解决方案运行良好!你知道我怎么把p1项包括在最后的等式中吗?e、 g.对于p1=2.805,“值”中的输出为(s1.hfg+s2.hfg)/2+2.805?谢谢
df1=df1.sort_values('p1')
s1=pd.merge_asof(df1,df2,left_on='p1',right_on='p2',direction='backward')
s2=pd.merge_asof(df1,df2,left_on='p1',right_on='p2',direction='forward')
df1['Value']=(s1.h+s2.h)/2
import numpy as np

# Generate some test data
x1 = np.random.randint(0,100,10)
x2 = np.vstack([np.random.randint(0,100,10),np.random.normal(0,1,10)]).T

# Repeat the two vectors
X1 = np.tile(x1,(len(x2),1))
X2 = np.tile(x2[:,0],(len(x1),1))
distance = np.abs(X1 - X2.T)
closest_idx = np.argmin(distance,axis=0)

print(x2[closest_idx,1])