使用条件测量行x和y数据之间的距离来创建新列

时间:2019-04-08 21:12:27

标签: python python-3.x

我有这个数据集,其中包含很多行,每个时间戳的x和y坐标不同PlyrID。我需要在数据集中创建一个新列,其中包含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")

我希望一列具有诸如欧几里得距离之类的距离度量标准

1 个答案:

答案 0 :(得分:0)

我不知道执行此操作的自动方式或更直接的方式,但是我检查了一些情况,这种方法似乎提供了正确的答案。 请不要不要对空值,缺失值,InBall为1的无人情况以及其他一些情况进行排序。为简单起见,我将所有内容默认设置为(0,0)。

还请注意,您可以使用数据透视表将其转换为列(如果需要的话):

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

但是我没有继续讲到这一点,因为这似乎并不是您想要的。

无论如何,我首先为timestamp生成了一个字典:持有球的球员的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:我本可以在第一个apply函数中完成所有工作,但是认为将输出分成apply然后是map会更容易理解正在发生的事情。

我使用了numpy(np),但是如果您愿意,也可以使用math.sqrt,它不会有所不同。

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

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