Python 熊猫按坐标合并

Python 熊猫按坐标合并,python,pandas,merge,Python,Pandas,Merge,我试图合并两个pandas表,在这里我找到了df2中的所有行,它们的坐标接近df1中的每一行。下面是一个例子 df1: x y val 0 0 1 A 1 1 3 B 2 2 9 C df2: x y val 0 1.2 2.8 a 1 0.9 3.1 b 2 2.0 9.5 c desired result: x y val_x val_y 0 0 1 A NaN 1 1 3 B

我试图合并两个pandas表,在这里我找到了df2中的所有行,它们的坐标接近df1中的每一行。下面是一个例子

df1: 
   x  y val
0  0  1   A
1  1  3   B
2  2  9   C

df2:
    x    y  val
0  1.2  2.8   a
1  0.9  3.1   b
2  2.0  9.5   c

desired result:
   x  y val_x val_y
0  0  1     A   NaN
1  1  3     B     a
2  1  3     B     b
3  2  0     C     c
df1中的每一行在df2中可以有0、1或多个对应的条目,并且应使用笛卡尔距离查找匹配项:

(x1 - x2)^2 + (y1 - y2)^2 < 1
(x1-x2)^2+(y1-y2)^2<1
输入数据帧有不同的大小,即使在本例中没有。我可以通过迭代df1中的行并在df2中查找close值来接近,但不确定从那里该做什么:

for i, row in df1.iterrows():
    df2_subset = df2.loc[(df2.x - row.x)**2 + (df2.y - row.y)**2 < 1.0]
    # ?? What now?
df1.iterrows()中的i行的

df2_subset=df2.loc[(df2.x-row.x)**2+(df2.y-row.y)**2<1.0]
# ?? 现在怎么办?

任何帮助都将不胜感激。我用一个ipython笔记本做了这个例子,所以你可以在这里查看/访问:

我找到了答案,尽管我对不得不循环df1中的行并不满意。在这种情况下,只有几百个,所以我可以处理它,但它不会像其他东西那样扩展。解决方案:

df2_list = []
df1['merge_row'] = df1.index.values  # Make a row to merge on with the index values
for i, row in df1.iterrows():
    df2_subset = df2.loc[(df2.x - row.x)**2 + (df2.y - row.y)**2 < 1.0]
    df2_subset['merge_row'] = i # Add a merge row
    df2_list.append(df2_subset)
df2_found = pd.concat(df2_list)

result = pd.merge(df1, df2_found, on='merge_row', how='left')
df2_列表=[]
df1['merge_row']=df1.index.values#创建一行以与索引值合并
对于i,df1.iterrows()中的行:
df2_subset=df2.loc[(df2.x-row.x)**2+(df2.y-row.y)**2<1.0]
df2_子集['merge_row']=i#添加一个合并行
追加(df2_子集)
df2_found=pd.concat(df2_列表)
result=pd.merge(找到df1、df2,在class='merge\u row',how='left'上)

SQL可以接受这一点,但您必须首先将数据帧转换为表。这样的语法非常清晰,但我不确定它是否会更快,或者相对于您已经做过的事情,它将如何扩展。