我想在每次比赛前总结我数据集中各支球队的主场胜利或客场胜利。
这是我的原始数据框:
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
索引的滚动
有什么主意吗?
致谢
答案 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
备注: