Dataframe:查找坐标点与另一列坐标点最近的列

2024-09-29 23:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理足球和足球运动员的跟踪数据。 我试图为每一排坐标点找到离球最近的球员,并创建一个新列,将最近的球员归属于球

示例数据

| ball_point | home_player1_point | home_player2_point | away_player1_point |
| --------   | --------------     | ----------------------------------
| (7.00,3.00)     (-15.37,8.22)           (25.3,-.2)         (12.0,12.9)

期望输出

| ball_point | home_player1_point | home_player2_point | away_player1_point | closest
| --------   | --------------     | ----------------------------------
| (7.00,3.00)     (-15.37,8.22)           (25.3,-.2)         (7.1,3.2)           away_player1       

这里是我工作笔记本的链接:https://github.com/piercepatrick/Articles_EDA/blob/main/nashSCProject.ipynb 与这个问题相关的工作可以在底部找到,尽管它现在很混乱。 我也用这个问题来帮助我:Find closest point in Pandas DataFrames

感谢任何帮助,我需要在今晚之前完成


Tags: 数据示例home链接笔记本point球员足球
1条回答
网友
1楼 · 发布于 2024-09-29 23:24:29

我假设您的数据帧有更多行。首先,您需要定义一些函数:两点之间的距离函数(我将使用欧几里德距离)和获取两个pandas.Series(或数据帧列)中点之间距离的函数:

def euc_dist(x,y):
    return ((x[0] - y[0])**2 +(x[1] - y[1])**2 )**(1/2)

def dist(s1,s2):    
    distances = [euc_dist(s1[i],s2[i]) for i in range(s1.shape[0])]
    return pd.Series(distances)

dist的返回值必须是一个pandas.Series,因为它必须是一个新列(我假设您的数据帧名为df):

distances_df = df.iloc[:,1:].apply(dist, args = (df["ball_point"],))
df["closest"] = distances_df.idxmin(axis = 1).apply(lambda x: str(x)[:-6])

函数dist从第二列开始应用,这就是我使用df.iloc[:,1:]的原因,它们都与“ball_position”列进行比较,这就是为什么它在args参数中,它必须是tuple

然后可以使用DataFrame.idxmin找到距离最小的列。lambda函数仅用于获取"away_player1",而不是示例中的"away_player1_point"

打印distances_dfdf给出:

#distances_df
   home_player1_point  home_player2_point  away_player1_point
0           22.970966           18.577675           11.090987

#df
  ball_point home_player1_point home_player2_point away_player1_point       closest
0     (7, 3)     (-15.37, 8.22)       (25.3, -0.2)       (12.0, 12.9)  away_player1

相关问题 更多 >

    热门问题