从 pandas 数据框中获取距离坐标中心最近的坐标

3

我有一个pandas数据框

id     x_value  y_value
100     1       2
200     3       1
300     5       3
400     3       6
500     3.2     3.5
600     4.5     3

我希望能够从这些坐标对中找到中间点,以便返回最接近中间点坐标的数据框行。
def get_centroid(df):
    lat_mean = df['x_value'].mean()
    lat_mean = df['x_value'].iloc[(df['x_value']-lat_mean).abs().argsort([:1]].tolist()[0]
    long_mean = df['y_value'].mean()
    long_mean = df['y_value'].iloc[(df['y_value']-long_mean).abs().argsort()[:1]].tolist()[0]
    return([lat_mean,long_mean])

但是这种方法是错误的,因为我无法得到确切的 df 对。

有其他的方法吗?

2个回答

2
中心点将是通过以下方式得到的平均x和y值:
df.mean()

x_value    3.283333
y_value    3.083333
dtype: float64

这将为您提供与平均值的最小平方距离的位置。
df.sub(df.mean()).pow(2).sum(1).idxmin()

500

这会得到你所需的行数据。
df.loc[[df.sub(df.mean()).pow(2).sum(1).idxmin()]]

     x_value  y_value
id                   
500      3.2      3.5

设置


df = pd.DataFrame({
        'x_value': [1.0, 3.0, 5.0, 3.0, 3.2, 4.5],
        'y_value': [2.0, 1.0, 3.0, 6.0, 3.5, 3.0]
    }, pd.Index([100, 200, 300, 400, 500, 600], name='id')
)

令人印象深刻的简洁语法。我甚至没有意识到 sqrt 不是必需的。 - Eric Duminil
1
感谢@EricDuminil。是的,与sqrt具有单调关系,因此min的位置不会改变。 - piRSquared

1
如果您正在寻找最小的欧几里得距离,您可以计算每行到中心点的距离,并选择最小值:
>>> import pandas as pd
>>> import numpy as np
>>> 
>>> df = pd.DataFrame([{'y': 2.0, 'x': 1.0, 'id': 100}, {'y': 1.0, 'x': 3.0, 'id': 200}, {'y': 3.0, 'x': 5.0, 'id': 300}, {'y': 6.0, 'x': 3.0, 'id': 400}, {'y': 3.5, 'x': 3.2, 'id': 500}, {'y': 3.0, 'x': 4.5, 'id': 600}])

>>> df = df.set_index('id')
>>> df
       x    y
id           
100  1.0  2.0
200  3.0  1.0
300  5.0  3.0
400  3.0  6.0
500  3.2  3.5
600  4.5  3.0
>>> center_x, center_y = df.mean()
>>> np.sqrt((center_x - df['x'])**2 + (center_y - df['y'])**2)
id
100    2.527295
200    2.102512
300    1.718688
400    2.930396
500    0.424918
600    1.219517
dtype: float64
>>> (np.sqrt((center_x - df['x'])**2 + (center_y - df['y'])**2)).idxmin()
500
>>> df.loc[(np.sqrt((center_x - df['x'])**2 + (center_y - df['y'])**2)).idxmin()]
x    3.2
y    3.5
Name: 500, dtype: float64

据我所知,这是与this answer相同的方法,但不够简洁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接