从坐标的质心获得pandas df的最近坐标

时间:2017-07-31 14:15:51

标签: python pandas

我有一只熊猫df

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 个答案:

答案 0 :(得分: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')
)

答案 1 :(得分:1)

如果您正在寻找最小的欧几里德距离,您可以计算每行的中心距离并选择最小的距离:

LuisIntent("AboutContact")]     
public async Task AboutContact(IDialogContext context, LuisResult result)
{
       await context.PostAsync("Our phone: 9999999999");

PromptDialog.Choice(context, this.AfterSelectionOption, new  String[] { 
"YES", "NO" },"Do you want more info?");
}

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