在键列值为sam的任何时候,在两行中切换两个值

2024-09-26 22:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三场棒球赛的下表。在每一个游戏中,我有两行代表在同一个游戏中的两个团队中每一个的信息。通过检查play\u homepositor列知道哪一行是指哪个团队的方法,如果该列有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

我也有每个队的得分

因此,我需要计算一个新的列,其中允许运行,它只是在具有相同游戏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\u homevisitor专栏中我总是有0,1,0,1的顺序,所以我想到了一个主意:

  1. 创建两个中间列,移动-1和+1。它将创建列升档和列降档。只分析每一对博弈;在升档时,主队得分上升,而在降档时,客队得分下降
df['downShift'] = df['Runs_scored'].shift(periods= 1).fillna(0)
df['upShift'] = df['Runs_scored'].shift(periods= -1).fillna(0)
  1. 如果play\u homevisitor为0,则我将在升档时获取值,否则,如果play\u homevisitor为1,则我将在降档时获取值

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


Tags: 方法游戏dfplayruns团队sfnatl
3条回答

我一直在想任何可能的方法,我注意到在play\u homevisitor专栏中我总是有0,1,0,1的顺序,所以我想到了一个主意:

  1. 创建两个中间列,移动-1和+1。它将创建列升档和列降档。只分析每一对博弈;在升档时,主队得分上升,而在降档时,客队得分下降
df['downShift'] = df['Runs_scored'].shift(periods= 1).fillna(0)
df['upShift'] = df['Runs_scored'].shift(periods= -1).fillna(0)
  1. 如果play\u homevisitor为0,则我将在升档时获取值,否则,如果play\u homevisitor为1,则我将在降档时获取值

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

可以将groupbyshift结合使用两次。然后使用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

如果所有对和列都已排序,请使用:

df = df.sort_values(['Game_ID','play_homevisitor'])

m1 = df['play_homevisitor'] == 0
m2 = df['play_homevisitor'] == 1

s1 = df.loc[m1, 'Runs_scored'].values
s2 = df.loc[m2, 'Runs_scored'].values
df.loc[m2, 'Runs_allowed'], df.loc[m1, 'Runs_allowed'] = s1, s2 

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

相关问题 更多 >

    热门问题