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”
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])