我有一个数据帧(称为" 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