我有一只熊猫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对。
还有其他办法吗?
答案 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的方法相同,但不够简洁。