我有三场棒球比赛的下表。每一场比赛,我有两行代表每一队在同一场比赛中的每一队的信息。要知道哪一行指的是哪个团队,方法是检查列play_homevisitor,如果列有1,则行是关于主团队(位于hometeam列中),但是如果是0,则行是关于访问者团队(位于vi248列中)。这是我的数据集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计算一个新列,它只是在具有相同Game_ID的每两行之间切换runs_scored的值,如下所示:
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的顺序,所以我想出了一个想法:
df‘’downShift‘=df’‘Runs_scored’..shift(periods= 1).fillna(0) df‘’upShift‘=df’‘Runs_scored’..shift(periods= -1).fillna(0)
df‘’Runs_allowed‘= df['play_homevisitor','downShift','upShift'].apply(lambda : x'upShift’如果x'play_homevisitor‘== _homevisitor’== x'downShift',axis=1)
发布于 2019-04-29 11:24:33
您可以结合使用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发布于 2019-04-29 11:03:03
我一直在考虑任何可能的方法,我注意到我在play_homevisitor专栏中总是有0,1,0-1的顺序,所以我想出了一个想法:
df‘’downShift‘=df’‘Runs_scored’..shift(periods= 1).fillna(0) df‘’upShift‘=df’‘Runs_scored’..shift(periods= -1).fillna(0)
df‘’Runs_allowed‘= df['play_homevisitor','downShift','upShift'].apply(lambda : x'upShift’如果x'play_homevisitor‘== _homevisitor’== x'downShift',axis=1)
发布于 2019-04-29 11:12:43
如果有所有对和列被排序,请使用:
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.0https://stackoverflow.com/questions/55901998
复制相似问题