【问题标题】:Distance between points in two data frames两个数据框中点之间的距离
【发布时间】:2020-04-14 03:04:50
【问题描述】:

我是 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

【问题讨论】:

  • scipy.spatial.distance_matrix 的东西。您的预期输出是什么?
  • @QuangHoang ijk 接近 abc。最后我需要把ijk的值加到abc的值上,这样就变成了9

标签: python pandas geographic-distance


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多