我有这个数据集,其中包含很多行,每个时间戳的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")
我希望一列具有诸如欧几里得距离之类的距离度量标准
答案 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
,它不会有所不同。
很抱歉,我找不到比这更优雅的东西了,希望这对您有所帮助。
如果有问题或需要更多帮助,请告诉我。