如何为每个索引值重置Pandas中的rolling()?

时间:2020-03-06 15:00:15

标签: python pandas dataframe indexing

我想在每次比赛前总结我数据集中各支球队的主场胜利或客场胜利。

这是我的原始数据框:

date              Home     Visitors    Result
2020-01-01        Paris     Lisbon       1
2020-01-03        Madrid    London       0
2020-01-13        Lisbon    Madrid       1
2020-01-14        London    Paris        1
2020-01-16        Lisbon    London       0 
2020-01-18        Paris     Madrid       1 
2020-01-20        Madrid    London       1 

结果= 1(主队获胜)

结果= 0(获胜团队)

使用df.set_index('date')[['home', 'result']].groupby(['home', 'date'])['result'].sum()时,我得到以下输出:

                        0  1
home      date
Lisbon    2020-01-13    0  1
          2020-01-16    1  0
London    2020-01-03    0  1
Madrid    2020-01-03    1  0
          2020-01-20    0  1
Paris     2020-01-01    0  1
          2020-01-18    0  1

我的预期结果是:

                        0  1
home      date
Lisbon    2020-01-13    0  0
          2020-01-16    0  1
London    2020-01-03    0  0
Madrid    2020-01-03    0  0
          2020-01-20    1  0
Paris     2020-01-01    0  0
          2020-01-18    0  1

我尝试了rolling(),但是我不知道如何重置每个home索引的滚动

有什么主意吗?

致谢

2 个答案:

答案 0 :(得分:0)

我认为您应该重组DF,为团队添加一列,而不是将球队名称放在本国/外地,而是将得分放在此处。

这样,您将能够按团队分组,并且能够使用(相对)新的namedAgg

分别汇总主队和客队的进球

如果您将DF重组为类似这样的内容

DATE     | TEAM     | HOME VICTORY | AWAY VICTORY
01-01-20   ATLETICO        1              0
01-01-20   DORTMUND        0              0
01-02-20   PSG             0              1
01-02-20   PORTO           0              0 
01-10-20   ATLETICO        0              1
01-10-20   PSG             0              1

并假设前2场比赛是Atl vs Dor,Atl赢得主场,然后其他比赛是PSG vs Por,PSG赢了,而第三场比赛是Atl vs PSG,Atl赢了。

您的总和功能可以按日期为您提供每支球队的胜利,或者如果您放弃日期,则可以获得整个锦标赛的总胜利。

按团队和日期分组:

TEAM     | DATE     | HOME VICTORY | AWAY VICTORY
ATLETICO   01-01-20        1              0
ATLETICO   01-10-20        0              1
PSG        01-02-20        0              1
PSG        01-10-20        0              0

或仅按团队分组以查看他们的整体表现

 TEAM     | HOME VICTORY | AWAY VICTORY
ATLETICO          1              1
PSG               0              1

答案 1 :(得分:0)

我只能通过复制所有行以在Home列中有一列指示团队的离开结果来做到这一点。完成此操作后,cumsum就可以完成工作,然后我们只需要演示操作即可获得预期的结果:

# repeat all lines to build a column away showing for a team its away victories
df2 = pd.concat([df, df[['date', 'Visitors']]
                 .rename(columns = {'Visitors': 'Home'})
                 .assign(away=1-df['Result'])],
                sort=False)

# sum the home and away victories
# and remove the current result from the sum of home victories to only
# keep previous ones
df3 = pd.concat([df2[['date', 'Home', 'Result']], df2.groupby('Home')
                 [['Result', 'away']].cumsum().rename(
                     columns={'Result': 'tot_home'})], axis=1, sort=False
                ).sort_values('date').reset_index(drop=True)

df3['tot_home'] -= df3['Result']

# forward fill by team to "merge" the home and away match results
df4 = df3.groupby('Home').apply(lambda x: x.ffill()).fillna(0).set_index(
    ['Home', 'date']).sort_index().drop(columns='Result')

# finaly get the expected result
df5 = df4.loc[df.set_index(['Home', 'date']).index].sort_index()

它给出:

                   tot_home  away
Home   date                      
Lisbon 2020-01-13       0.0   0.0
       2020-01-16       1.0   0.0
London 2020-01-14       0.0   1.0
Madrid 2020-01-03       0.0   0.0
       2020-01-20       0.0   0.0
Paris  2020-01-01       0.0   0.0
       2020-01-18       1.0   0.0

备注:

  • 我使用了不同的数据框名称(df2-df5)来查看所有中间结果。可以使用一个df2。
  • 我并没有给出确切的答案,但是我认为正确的值是我的值。