Если вам нужна информация о том, «как мяч двигался», включая дриблинг, вы можете сделать следующее:
0: я немного упростил ввод:
d_e = {'seconds':[1,2,3,4,5], 'event' : ['passed', 'received', 'touch', 'passed', 'received'], 'player' : ['Steve', 'Michael','Michael','Michael','George']}
d_x = {'seconds':[1,2,3,4,5], 'Steve': [11.43, 11.45, 10.99, 11.34, 12.43], 'Michael':[12.33, 12.46, 10.33, 10.36, 12.22], 'George': [15.33, 13.22, 14.33, 11.22, 11.78]}
d_y = {'seconds':[1,2,3,4,5], 'Steve': [13.43, 13.45, 12.99, 12.34, 12.00], 'Michael':[9.33, 9.46, 10.53, 12.36, 12.72], 'George': [10.33, 10.22, 10.33, 11.72, 12.78]}
df_e = pd.DataFrame(d_e)
df_x = pd.DataFrame(d_x)
df_y = pd.DataFrame(d_y)
1: объединить X и Y для кортежей для координат:
Конечно, вам не нужно использовать кортежи, и вы можете придерживаться решения, подобного заданному @ckedar, соответственно отрегулируйте ключи позже.
df_merged = df_x.merge(df_y, on=['seconds']).set_index('seconds')
df_merged=df_merged.groupby(df_merged.columns.str.split('_').str[0],axis=1).agg(lambda x : tuple(x.tolist()))
Результат:
George Michael Steve
seconds
1 (15.33, 10.33) (12.33, 9.33) (11.43, 13.43)
2 (13.22, 10.22) (12.46, 9.46) (11.45, 13.45)
3 (14.33, 10.33) (10.33, 10.53) (10.99, 12.99)
4 (11.22, 11.72) (10.36, 12.36) (11.34, 12.34)
5 (11.78, 12.78) (12.22, 12.72) (12.43, 12.0)
2: Поместить координаты в фрейм данных события:
df_e['coord'] = df_e.apply(lambda x : df_merged.loc[x['seconds']][x['player']] ,axis=1)
Результат:
seconds event player coord
0 1 passed Steve (11.43, 13.43)
1 2 received Michael (12.46, 9.46)
2 3 touch Michael (10.33, 10.53)
3 4 passed Michael (10.36, 12.36)
4 5 received George (11.78, 12.78)
3: Создать новый df с помощью "from" и " to "information:
Здесь вам придется настраивать различные ключи, если вы не используете кортежи в качестве координат, а скорее X и Y.
df_new = pd.DataFrame(columns=['second', 'from', 'to', 'from_coord', 'to_coord'])
df_new[['second', 'from', 'from_coord']] = df_e[['seconds', 'player', 'coord']].iloc[:-1]
df_new[['to', 'to_coord']] = df_e[['player', 'coord']].iloc[1:].reset_index().drop('index',axis=1)
df_new = df_new.set_index('second')
Результат:
from to from_coord to_coord
second
1 Steve Michael (11.43, 13.43) (12.46, 9.46)
2 Michael Michael (12.46, 9.46) (10.33, 10.53)
3 Michael Michael (10.33, 10.53) (10.36, 12.36)
4 Michael George (10.36, 12.36) (11.78, 12.78)
4 (необязательно): теперь вы можете получать пасы и дриблинг:
print('Passes:')
print(df_new[df_new['from'] != df_new['to']])
print('Dribbling:')
print(df_new[df_new['from'] == df_new['to']])
Результат:
Passes:
from to from_coord to_coord
second
1 Steve Michael (11.43, 13.43) (12.46, 9.46)
4 Michael George (10.36, 12.36) (11.78, 12.78)
Dribbling:
from to from_coord to_coord
second
2 Michael Michael (12.46, 9.46) (10.33, 10.53)
3 Michael Michael (10.33, 10.53) (10.36, 12.36)