Python - 根据数据帧中的信息创建包含球队对手名称的列



我有一个数据帧(称为" games"),其中包含一场篮球比赛的详细比赛列表,我在其中记录单场比赛中的得分记录(GameID标识特定的比赛)。数据帧按匹配(即GameID)排序。

数据集"games"示例:

GameID  TeamID  Scoring Streak 
0   nbaG1     A        23     
1   nbaG1     B        12   
2   nbaG1     B        11   
3   nbaG1     A        24  
4   nbaG1     B        21 
5   nbaG2     C        15  
6   nbaG2     C        12 
7   nbaG2     D        17 
8   nbaG2     C        11
9   nbaG2     D        21 
10  nbaG3     E        10 
11  nbaG3     F        12  
12  nbaG3     F        14

从这个数据框中,我想简单地创建一个列,显示各自比赛中对方球队的名字。例如,在游戏1 (nbaG1)中,是A队对b队。所以,如果A队得分,新列"对手";应该说";B"。但是我不知道如何在每场比赛中扫描名字并返回对方球队的值…我也没有在其他线程中找到提示。

我的数据集的期望输出"games":

GameID  TeamID  Scoring Streak  Opponents
0   nbaG1     A        23              B
1   nbaG1     B        12              A
2   nbaG1     B        11              A
3   nbaG1     A        24              B
4   nbaG1     B        21              A
5   nbaG2     C        15              D
6   nbaG2     C        12              D
7   nbaG2     D        17              C
8   nbaG2     C        11              D
9   nbaG2     D        21              C
10  nbaG3     E        10              F
11  nbaG3     F        12              E
12  nbaG3     F        14              E

首先,按GameID分组数据帧并调用.unique()以获得正在玩游戏的两支球队

teams = df.groupby("GameID")["TeamID"].unique()
# game_teams :
GameID
nbaG1    [A, B]
nbaG2    [C, D]
nbaG3    [E, F]

然后,使用这个来查找每场比赛中的两支球队,并将该列添加到原始数据框架中:

df["Teams"] = teams[df["GameID"]].to_list()
# df: 
GameID TeamID  Scoring Streak   Teams
0   nbaG1      A              23  [A, B]
1   nbaG1      B              12  [A, B]
2   nbaG1      B              11  [A, B]
3   nbaG1      A              24  [A, B]
4   nbaG1      B              21  [A, B]
5   nbaG2      C              15  [C, D]
6   nbaG2      C              12  [C, D]
7   nbaG2      D              17  [C, D]
8   nbaG2      C              11  [C, D]
9   nbaG2      D              21  [C, D]
10  nbaG3      E              10  [E, F]
11  nbaG3      F              12  [E, F]
12  nbaG3      F              14  [E, F]

最后,apply对每一行取Teams中不属于TeamID的元素的函数

def select_opponent(row):
for team in row["Teams"]:
if team != row["TeamID"]:
return team
return None
df["Opponent"] = df.apply(select_opponent, axis=1)
# df: 
GameID TeamID  Scoring Streak   Teams Opponent
0   nbaG1      A              23  [A, B]        B
1   nbaG1      B              12  [A, B]        A
2   nbaG1      B              11  [A, B]        A
3   nbaG1      A              24  [A, B]        B
4   nbaG1      B              21  [A, B]        A
5   nbaG2      C              15  [C, D]        D
6   nbaG2      C              12  [C, D]        D
7   nbaG2      D              17  [C, D]        C
8   nbaG2      C              11  [C, D]        D
9   nbaG2      D              21  [C, D]        C
10  nbaG3      E              10  [E, F]        F
11  nbaG3      F              12  [E, F]        E
12  nbaG3      F              14  [E, F]        E

对于每场比赛超过两支球队的一般方法,您可以使用集合:首先计算每场比赛的球队集合,然后通过计算球队集合与仅包含球队本身的集合之间的集合差来获得每行的对手。

teams_per_game = games.groupby('GameID')['TeamID'].apply(set)
opponents = []
for i in games.index:
opponents.append((teams_per_game.loc[games.loc[i, 'GameID']] 
- {games.loc[i, 'TeamID']}).pop())
games['Opponents'] = opponents

相关内容

  • 没有找到相关文章

最新更新