编写函数以获取列C / D的总和,最后一次列A / B为特定值

问题描述 投票:2回答:1

我有一个包含运动成绩的数据表。他们被贴上这样的标签,其中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()?

非常感谢。

python pandas
1个回答
0
投票

假设您的列名是['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
© www.soinside.com 2019 - 2024. All rights reserved.