我有一个包含运动成绩的数据表。他们被贴上这样的标签,其中A列为主队,B列为客队,C列为主队得分,D列为客队得分,E列为最终结果。如果有帮助/重要,末尾还有一个日期列。
PIT PHI 4 5 Away
PIT BOS 3 5 Away
BOS SJS 3 2 Home
SJS PHI 1 1 Draw
PIT SJS 3 2 Home
PHI BOS 4 3 Home
我想做的是在此数据框中添加两列。第一个应该有主队在最近3场比赛(所有比赛,而不仅仅是主场比赛)中进球的总和-但不包括当前行的结果。第二个应该具有客队在最近3场比赛(所有比赛,而不仅仅是客场比赛)中进球的总和-但不包括当前行的结果。
因此,假设此工作表的下一行具有:BOS作为主队,PIT作为主队。在此之前,BOS在最近的3场比赛中攻入11球。在此比赛之前的最近3场比赛中,PIT取得了10个进球。因此,假设游戏以5-5结束(或无论结果如何),该行应看起来像这样,并增加了两列。
BOS PIT 5 5 Draw 11 10
有几件事使我感到困难。
在查找最后3次值出现在数据框中时(假设为“ BOS”),我不知道如何弄清楚它可以出现在A列还是B列中。而且我也不知道如何指定当BOS在A列中时应从C列中添加值,而当BOS在B列中时应从D列中添加值。
我想这样做而无需转置数据集,以便每个团队都有自己的台词。即我不要:
BOS 5 Draw 11
PIT 5 Draw 10
原始数据集需要保留其格式。
最后,我也不清楚如何将其添加到行中,但不将当前行包括在总和中。是否只是以某种方式使用shift()?
非常感谢。
假设您的列名是['Home', 'Away', 'Home_Score', 'Away_Score', 'Winner']
,这就是我要做的:
for team, score in zip(['Home','Away'], ['Home_Score', 'Away_Score']):
df[f'{team}_last3'] = (df.groupby(team)[score]
.rolling(3,min_periods=1).sum()
.sort_index(level=1)
.groupby(team).shift(fill_value=0)
.reset_index(level=0, drop=True)
)
输出(用于此示例数据):
Home Away Home_Score Away_Score Winner Home_last3 Away_last3
0 PIT PHI 4 5 Away 0.0 0.0
1 PIT BOS 3 5 Away 4.0 0.0
2 BOS SJS 3 2 Home 0.0 0.0
3 SJS PHI 1 1 Draw 0.0 5.0
4 PIT SJS 3 2 Home 7.0 2.0
5 PHI BOS 4 3 Home 0.0 5.0