【问题标题】:Python - creating column containing the name of a team's opponent based on info in dataframePython - 根据数据框中的信息创建包含团队对手名称的列
【发布时间】:2021-10-27 04:48:11
【问题描述】:

我有一个数据框(称为“游戏”),其中包含篮球比赛的逐场比赛列表,我在其中记录单场比赛的得分连胜记录(GameID 标识特定比赛)。数据帧按匹配项(即 GameID)排序。

数据集“游戏”示例:

    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

我想从这个数据框中简单地创建一个列,显示相应比赛中对方球队的名称。例如在 Game1 (nbaG1) 中是 A 队对 B 队。因此,如果 A 队得分,新列“对手”应显示“B”。但是我不知道如何在每场比赛中扫描名称并返回对方球队的价值......我也没有在其他线程中找到提示。

我的数据集“游戏”的所需输出:

    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

【问题讨论】:

  • 你能把你的部分代码发给我们吗?
  • @VictorSaraivaRocha 复制 OP 的数据框并执行 df = pd.read_clipboard(sep=r"\s\s+")
  • 谢谢,Pranav Hosangadi!我不知道。

标签: python pandas


【解决方案1】:

首先,按 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

【讨论】:

  • 虽然您的答案正是 OP 所期望的,但我对行数奇数存在分歧。你怎么看?
  • @Corralien 我不确定我是否理解。只要每个GameID 只有两个团队,为什么奇数行很重要?我认为您的困惑源于每场比赛有两个以上的参赛作品(每队每场比赛超过一个)。
  • @Corralien 我不确定 OP 的“连续得分”代表什么,但如果你用“得分球员”代替它,例如,我认为它会更有意义:可以有一个一场比赛中得分奇数的球员,但这并不影响对手是谁
  • 是的,你可能是对的!为您的回答 +1。
  • 感谢 Pranav 提供此代码,按照应有的方式工作,并且始终返回对方球队,以及每场比赛的球队名单 :-) 为澄清起见,得分条纹列列出了未回答的分数各自球队得分。因此,例如在第一行 A 队连续获得 23 分,B 队没有任何积分。所以确实很可能出现奇数行:-)
【解决方案2】:

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

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

【讨论】:

  • 谢谢你,Arne,这就像一个魅力,并准确返回我需要的东西,即使是我的大数据集!
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2023-01-10
  • 2020-10-25
  • 1970-01-01
  • 2018-06-10
  • 2022-06-16
  • 1970-01-01
相关资源
最近更新 更多