如何为一列中的每个元素找到另一列中最接近的元素?

时间:2019-06-23 22:44:50

标签: python pandas

情况如下。

我有两个熊猫数据框:

  • df1 ,其中包含一列“ p1” ,其中包含1895行随机数,范围从2.805到3.035(此处是前20行):
         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
  • df2 ,其中包含两列“ p2” “ h”
    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

  • 然后,如果这两个值相同,则该行的输出为 h
  • 的对应值。
  • 否则,输出为 h 的前一个值和后一个值的平均值。

回到我们的示例,p1[0]的输出应为(h[1]+h[3])/2

我希望这一切都说得通,这是我在这里的第一个问题:)。 谢谢!

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