首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在键列值相同的任何时候,在两行中切换两个值

在键列值相同的任何时候,在两行中切换两个值
EN

Stack Overflow用户
提问于 2019-04-29 11:03:03
回答 3查看 41关注 0票数 0

我有三场棒球比赛的下表。每一场比赛,我有两行代表每一队在同一场比赛中的每一队的信息。要知道哪一行指的是哪个团队,方法是检查列play_homevisitor,如果列有1,则行是关于主团队(位于hometeam列中),但是如果是0,则行是关于访问者团队(位于vi248列中)。这是我的数据集df

代码语言:javascript
复制
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计算一个新列,它只是在具有相同Game_ID的每两行之间切换runs_scored的值,如下所示:

代码语言:javascript
复制
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. 创建两个中间列,移动-1和+1 runs_scored。它将创建列upShift和列downShift。只分析每对game_D;在upShift中,hometeam的得分将上升,而在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时,则取下移位值。

df‘’Runs_allowed‘= df['play_homevisitor','downShift','upShift'].apply(lambda : x'upShift’如果x'play_homevisitor‘== _homevisitor’== x'downShift',axis=1)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-29 11:24:33

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

代码语言:javascript
复制
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)
代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-04-29 11:03:03

我一直在考虑任何可能的方法,我注意到我在play_homevisitor专栏中总是有0,1,0-1的顺序,所以我想出了一个想法:

  1. 创建两个中间列,移动-1和+1 runs_scored。它将创建列upShift和列downShift。只分析每对game_D;在upShift中,hometeam的得分将上升,而在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时,则取下移位值。

df‘’Runs_allowed‘= df['play_homevisitor','downShift','upShift'].apply(lambda : x'upShift’如果x'play_homevisitor‘== _homevisitor’== x'downShift',axis=1)

票数 0
EN

Stack Overflow用户

发布于 2019-04-29 11:12:43

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55901998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档