python - 创建一个新列,使用条件测量行 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")
我期望一个具有距离度量的列,例如欧几里得距离
解决方案
我不知道自动或更直接的方法可以做到这一点,但我检查了几个案例,这种方法似乎提供了正确的答案。请不要对空值、缺失值、没有InBall
1 的情况和其他一些情况进行排序。为简单起见,我将所有内容默认为 (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
会更容易理解正在发生的事情。apply
map
我使用了 numpy ( np
),但math.sqrt
如果你愿意,你也可以使用,它不应该有所作为。
很抱歉,我找不到比这更优雅的东西了,希望这仍然有所帮助。
如果有问题或者您需要更多帮助,请告诉我。
推荐阅读
- sqlite - CN1 DAO 不断失败,原因不明
- java - 每当我尝试输入我的设置时,logcat 都会向我显示此错误,我不知道出了什么问题
- batch-file - 詹金斯 - cmd无法识别
- python - numpy tofile 在每一行中放置单引号
- javascript - 循环常量,让图声明......如何解决?
- python - 将列表的最后两个整数的总和附加到同一个列表
- html - 是否可以仅使用引导程序来实现此布局?
- java - 使用 JavaAssist 修改现有类时出错
- css - 如何从 GitHub 以不同的权重显示 Noto Sans?
- python - 使用多列定义的频率填充 groupby 中的缺失日期