У меня есть DataFrame, состоящий из набора данных из игр с двумя игроками. В каждой игре (с уникальным идентификатором) есть несколько раундов, в которых каждый из двух игроков выбирает какое-то действие. Это выглядит следующим образом (я удалил некоторые строки для ясности):
gameId round player action
0 Afom9bWqYBgZXXXN8 1 PvQ8B5kuA9Fbq9N59 1
1 Afom9bWqYBgZXXXN8 1 PJmJgrqusFZ8KRShQ 0
2 Afom9bWqYBgZXXXN8 2 PvQ8B5kuA9Fbq9N59 0
3 Afom9bWqYBgZXXXN8 2 PJmJgrqusFZ8KRShQ 0
4 Afom9bWqYBgZXXXN8 3 PJmJgrqusFZ8KRShQ 0
5 Afom9bWqYBgZXXXN8 3 PvQ8B5kuA9Fbq9N59 0
20 QdZM4yPMnjGj8f25R 1 Q6knaWEruc6BDPQT7 1
21 QdZM4yPMnjGj8f25R 1 xnAjMcWaFRpfBbukz 1
22 QdZM4yPMnjGj8f25R 2 xnAjMcWaFRpfBbukz 1
23 QdZM4yPMnjGj8f25R 2 Q6knaWEruc6BDPQT7 0
24 QdZM4yPMnjGj8f25R 3 Q6knaWEruc6BDPQT7 1
25 QdZM4yPMnjGj8f25R 3 xnAjMcWaFRpfBbukz 1
40 riMD6ctT8DLwdhHpE 1 EKkrMpMqy2PRLm7ur 1
41 riMD6ctT8DLwdhHpE 1 EqbbmngPfZBEmPTzq 1
42 riMD6ctT8DLwdhHpE 2 EKkrMpMqy2PRLm7ur 1
43 riMD6ctT8DLwdhHpE 2 EqbbmngPfZBEmPTzq 1
44 riMD6ctT8DLwdhHpE 3 EqbbmngPfZBEmPTzq 1
45 riMD6ctT8DLwdhHpE 3 EKkrMpMqy2PRLm7ur 1
60 hyEjkAg5K4WpubJA9 1 7CHpY4setLKb9ssnN 1
61 hyEjkAg5K4WpubJA9 1 hbud2J3YvitEhj4xZ 0
62 hyEjkAg5K4WpubJA9 2 hbud2J3YvitEhj4xZ 0
63 hyEjkAg5K4WpubJA9 2 7CHpY4setLKb9ssnN 0
64 hyEjkAg5K4WpubJA9 3 7CHpY4setLKb9ssnN 0
65 hyEjkAg5K4WpubJA9 3 hbud2J3YvitEhj4xZ 1
80 ay5pmpeNcwqHJ8JBH 1 tWA9ZxSnKpZyWwYsQ 1
81 ay5pmpeNcwqHJ8JBH 1 2qiHdJgL4WQe5qrHQ 1
82 ay5pmpeNcwqHJ8JBH 2 2qiHdJgL4WQe5qrHQ 1
83 ay5pmpeNcwqHJ8JBH 2 tWA9ZxSnKpZyWwYsQ 1
84 ay5pmpeNcwqHJ8JBH 3 tWA9ZxSnKpZyWwYsQ 1
85 ay5pmpeNcwqHJ8JBH 3 2qiHdJgL4WQe5qrHQ 1
Я хочу добавить новый столбец в DataFrame, который содержит для действий каждого игрока в данном раунде действия его/ее противника в предыдущем раунде. той же игры, если таковая имеется. Какой быстрый и краткий способ сделать это вместо использования очень длинного (и медленного) цикла?
Обратите внимание, что в каждом ключе (gameId, round)
есть только два игрока с разными идентификаторами. Dataframe.merge кажется близким совпадением ( example), но для этого потребуется что-то вроде следующего:
df.merge(df_copy, left_on=['gameId', 'round', 'player'], \
right_on=['gameId', df_copy.round - 1, df.player != df_copy.player])
но он не может поддерживать df.player != df_copy.player
в состоянии самосоединения.