首页 > 解决方案 > 创建一个新列,使用条件测量行 x 和 y 数据之间的距离

问题描述

我有这个数据集,其中包含很多行以及PlyrID每个时间戳不同的 x 和 y 坐标。我需要在我的数据集中创建一个新列,其中包含具有的行与具有的行的InBallPos == 1距离InBallPos == 0。请注意,每个时间戳都有相同的PlyrID.

我尝试了很多教程,阅读了很多关于机器学习和 python 的内容,但无法使其工作请帮助!

到目前为止在没有距离测量的情况下尝试了这个(这也不起作用):

import pandas as pd

data = pd.read_csv('football.csv', index_col = 0)

f1 = data["IsPassOption"] == 1
f2 = data["IsPassOption"] == 0
f3 = data["InBallPos"] == 1
f4 = data["InBallPos"] == 0
f4 = data["InBallPos"] == 0
f5 = data["TeamID"] == 0
f6 = data["TeamID"] == 1

every_filter = f1+f2+f3+f4+f5+f6
data[every_filter].sort_values("Timestamp")

我期望一个具有距离度量的列,例如欧几里得距离

标签: pythonpython-3.x

解决方案


我不知道自动或更直接的方法可以做到这一点,但我检查了几个案例,这种方法似乎提供了正确的答案。请不要对空值、缺失值、没有InBall1 的情况和其他一些情况进行排序。为简单起见,我将所有内容默认为 (0,0)。

另请注意,您可能可以使用数据透视表将其转换为列(如果这是您想要的),例如:

pivot = pd.pivot_table(data[['Timestamp','PlrID','X','Y']],index='Timestamp',columns='PlrID')

但我没有继续超过这一点,因为它似乎不是你想要的。

无论如何,我首先为时间戳生成了一个字典:拿着球的球员的XY坐标:

InBall_1 = data[data['InBallPos']==1][['Timestamp','X', 'Y','PlrID']]
player_with_ball=(InBall_1[['Timestamp','X','Y']].values)
player_with_ball={int(k):(a,b) for k,a,b in player_with_ball}

然后我使用这本字典和几个 lambda 函数逐行读取并获取距离:

data['distance'] = data.fillna(0).apply(lambda x: (
    player_with_ball.get(x['Timestamp'],(0,0)),x['X'],x['Y']),axis=1).map(
    lambda x: np.sqrt((x[0][0]-x[1])**2+(x[0][1]-x[2])**2))

注意fillna(0)和负责字典查找的默认值和默认值的,(0,0)部分。na注意 2:我本可以在第一个函数中完成所有工作,但认为通过将其拆分为then输出apply会更容易理解正在发生的事情。applymap

我使用了 numpy ( np),但math.sqrt如果你愿意,你也可以使用,它不应该有所作为。

很抱歉,我找不到比这更优雅的东西了,希望这仍然有所帮助。

如果有问题或者您需要更多帮助,请告诉我。


推荐阅读