0

我是 python 新手,我尝试搜索但找不到解决方案。

我有两个带有笛卡尔坐标的数据框。

node    x      y    value
abc    645    714   8 
def    187    754   11 

location  x    y    value
ijk      621  744   1 
lmn      202  720   -5  

我想找到 df2 中每个位置与 df1 中的节点的最小距离,并更新 df1 中的“值”。

我已经看到 cdist 来计算最小距离,但是如何将其链接回对应的?节点

由于ijk接近abc,lmn接近def,所以最终答案应该是

node    x      y    value
abc    645    714   9 
def    187    754   6
4

1 回答 1

0

这是一种从头开始的方法:

import numpy as np
import pandas as pd

df1 = pd.DataFrame({'node': ['abc', 'def'], 
                    'x': [645, 187], 
                    'y': [714, 754], 
                    'value': [8, 11]}) 
df2 = pd.DataFrame({'location': ['ijk', 'lmn'], 
                    'x': [621,  202], 
                    'y': [744, 720], 
                    'value': [1, -5]}) 

# compute Euclidean distances (using Pythagoras' theorem)
df2['distances'] = [[((df1['x'][j] - df2['x'][i]) ** 2 
                    + (df1['y'][j] - df2['y'][i]) ** 2) ** 0.5 
                     for j in range(len(df1))] 
                    for i in range(len(df2))]
df2
    location  x     y      value  distances
0   ijk       621   744     1     [38.41874542459709, 434.11519208615584]
1   lmn       202   720    -5     [443.0406301909566, 37.16180835212409]
df1['new_value'] = [df1['value'][row] + df2['value'][np.argmin(df2['distances'][row])] 
                    for row in range(len(df1))] 
df1
    node    x       y      value  new_value
0   abc     645     714     8     9
1   def     187     754    11     6
于 2020-04-13T19:04:50.963 回答