情况如下。
我有两个熊猫数据框:
p1
0 2.910
1 2.885
2 2.875
3 2.855
4 2.910
5 2.870
6 2.850
7 2.875
8 2.865
9 2.875
10 2.890
11 2.910
12 2.965
13 2.955
14 2.935
15 2.905
16 2.900
17 2.905
18 2.970
19 2.940
p2 h
0 2.7 256.88
1 2.8 253.52
2 2.9 250.18
3 3.0 246.86
4 3.1 243.55
目标是首先遍历 df1 中的所有行,并在 p2 中为每一行找到最接近的元素。例如对于p1[0] = 2.910
,最接近的元素是p2[2] = 2.9
。
回到我们的示例,p1[0]
的输出应为(h[1]+h[3])/2
我希望这一切都说得通,这是我在这里的第一个问题:)。 谢谢!
答案 0 :(得分:1)
这是merge_asof
的用法,请注意allow_exact_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
答案 1 :(得分:1)
使用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])