首页 > 解决方案 > 在键列值相同的任何时候切换两行中的两个值

问题描述

我有 3 场棒球比赛的下表。每场比赛,我有两行代表在同一​​场比赛中参加比赛的两支球队中的每一支球队的信息。通过检查列 play_homevisitor 来知道哪一行指的是哪支球队,如果它有 1,则该行是关于主队的(位于 hometeam 列中),但如果它是 0,那么该行是关于访客的团队(位于 visteam 列)。这是我的数据集df

Game_ID             hometeam    visteam play_homevisitor    Runs_scored
ATL199204090         ATL         SFN           0                13
ATL199204090         ATL         SFN           1                6
ATL199204100         ATL         SFN           0                3
ATL199204100         ATL         SFN           1                6
ATL199204110         ATL         SFN           0                4
ATL199204110         ATL         SFN           1                0

我还有每个团队的 runs_scored 数。

所以,我需要用runs_allowed计算一个新列,它只是在每两行之间切换runs_scored的值,具有相同的Game_ID,如下:

Game_ID        hometeam visteam play_homevisitor    Runs_scored     Runs_allowed       
ATL199204090    ATL      SFN           0                13                6
ATL199204090    ATL      SFN           1                6                 13
ATL199204100    ATL      SFN           0                3                 6
ATL199204100    ATL      SFN           1                6                 3
ATL199204110    ATL      SFN           0                4                 0
ATL199204110    ATL      SFN           1                0                 4

我有一种可能的方法,但我很好奇你是否有另一种方法。

我一直在想任何可能的方法,我注意到我在 play_homevisitor 列中总是有 0,1,0,1 的序列,所以我想到了一个想法:

  1. 创建两个中间列,将 runs_scored 移到 -1 和 +1。它将创建 upShift 列和 downShift 列。只分析每一对game_D;在 upShift 中,主队得分将上升,在 downShift 中,客队得分将下降。
df['downShift'] = df['Runs_scored'].shift(periods= 1).fillna(0)
df['upShift'] = df['Runs_scored'].shift(periods= -1).fillna(0)
  1. 那么如果 play_homevisitor 为 0,我将在 upShift 中取值,否则,如果 play_homevisitor 为 1,我将在 downshift 中取值

df['Runs_allowed'] = df[['play_homevisitor','downShift', 'upShift']].apply(lambda x: x['upShift'] if x['play_homevisitor'] == 0 else x['downShift '],轴=1)

标签: pythonpandas

解决方案


您可以groupby结合使用shift两次。然后使用fillna创建新列:

s1 = df.groupby('Game_ID')['Runs_scored'].shift(-1)
s2 = df.groupby('Game_ID')['Runs_scored'].shift(1)

df['Runs_allowed'] = s1.fillna(s2).astype(int)

print(df)
        Game_ID hometeam visteam  play_homevisitor  Runs_scored  Runs_allowed
0  ATL199204090      ATL     SFN                 0           13             6
1  ATL199204090      ATL     SFN                 1            6            13
2  ATL199204100      ATL     SFN                 0            3             6
3  ATL199204100      ATL     SFN                 1            6             3
4  ATL199204110      ATL     SFN                 0            4             0
5  ATL199204110      ATL     SFN                 1            0             4

推荐阅读