我正在尝试合并两个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
输入数据框的大小不同,即使它们不在此示例中。我可以通过迭代df1中的行并在df2中找到接近的值来接近,但我不知道该怎么做:
for i, row in df1.iterrows():
df2_subset = df2.loc[(df2.x - row.x)**2 + (df2.y - row.y)**2 < 1.0]
# ?? What now?
非常感谢任何帮助。我用ipython笔记本制作了这个例子,你可以在这里查看/访问:http://nbviewer.ipython.org/gist/anonymous/49a3d821420c04169f02
答案 0 :(得分:1)
我找到了答案,尽管我不乐意在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')