我有一个熊猫DataFrame,其中保存了2018/19英超联赛的结果。有380个匹配项(行)。最后一列“ BTS”指示两队在比赛中是否均进球。
bts.head()
HomeTeam AwayTeam FTHG FTAG BTS
Man United Leicester 2 1 Y
Bournemouth Cardiff 2 0 N
Fulham Crystal Palace 0 2 N
Huddersfield Chelsea 0 3 N
Newcastle Tottenham 1 2 Y
我想要生成的是每个团队(20个团队)的摘要,其中显示了BTS N和Y的总数,他们是主队,而客队是。并得出每个团队的总BTS N和Y。
我正在为每个赛季寻找的摘要如下。
Team BTS Home Away Total
Arsenal N 8 4 12
Y 11 15 26
Bournemouth N 9 12 21
Y 10 7 17
我尝试了多种方法来对这些数据进行分组,如果同时对“ HomeTeam”和“ AwayTeam”进行分组,则此方法将行不通。通过为“ HomeTeam”和“ AwayTeam”创建两个单独的数据框,然后将它们串联成一个新的框并重命名这些列,我确实设法获得了某种期望的结果。虽然这种方法看起来很费力。有人可以建议如何用更少的步骤做到这一点。
如何将两者结合起来以产生以“团队”为标题的结果?
FTHG和FTAG是指比赛中的全场主场进球和全场客场进球。它们的值在此处无需包含在任何汇总计算中,因为BTS值(是或否)是从原始数据帧中的值得出的。我想要的是每个独特团队在“家庭团队”和“客队”之间的BTS Y或N的摘要计数,以及每个团队的Y和N总数。
我能够通过以下操作产生预期的结果,但这似乎是一个漫长的过程。
bts_home = bts.groupby(['HomeTeam','BTS'])['BTS'].count()
bts_home = bts.groupby(['HomeTeam','BTS'])['BTS'].count()
这产生两个系列。头部看起来像:
bts_home
HomeTeam BTS
Arsenal N 8
Y 11
Bournemouth N 9
Y 10
bts_away
AwayTeam BTS
Arsenal N 4
Y 15
Bournemouth N 12
Y 7
然后我使用以下命令将它们转换为DataFrames:
df1 = pd.DataFrame(bts_home)
df2 = pd.DataFrame(bts_away)
这些数据框现在已被多个索引,其名称为:
df1 - ['HomeTeam','BTS']
df2 - ['AwayTeam','BTS']
然后我重命名了每个DataFrame中包含BTS计数的列:
df1.columns = ['BTS_Home']
df2.columns = ['BTS_Away']
然后串联两个数据框:
df3 = pd.concat([df1, df2], axis = 1)
然后在另一个新的DataFrame中得出总的“ BTS”值:
df4 = df3.assign(Total = df3['BTS_Home'] + df3['BTS_Away'])
然后重命名多重索引的0级:
df4.index.set_names('Team', level = 0, inplace = True)
哪个给:
df4
BTS_Home BTS_Away Total
Team BTS
Arsenal N 8 4 12
Y 11 15 26
Bournemouth N 9 12 21
Y 10 7 17
......
Wolves N 11 8 19
Y 8 11 19
这最终会产生所需的摘要。但是有很多争执。我可以通过具有各种If条件的For循环并遍历每个团队的所有结果和BTS值来实现相同的效果,尽管这也是解决问题的漫长且低效的方法。
很多因素都是由熊猫效率决定的,所以我想知道的是,是否有一种更快,更有效的方法来实现这种分组,并对原始DataFrame中每个团队的BTS值进行汇总。
只需重新重申。防弹少年团的计数为“两队得分”。摘要示例为:
在2018/19赛季,阿森纳和对方球队进球均参与了多少场比赛? (防弹少年团= Y)
还有。阿森纳参与了多少场主场和客场比赛,而他们和/或对方球队均未进球。 (防弹少年团= N)
我们希望20个团队中的每一个都具有相同的摘要。
请注意,我认为在此计算中不需要布尔条件,因为每个匹配项的BTS值Y或N已在原始数据集中导出。我只希望每个家庭(无论在家还是在外)的Y和N分组计数。
有没有人知道获得此摘要的方法比完成上述所有步骤更快?