熊猫如何在两列中获取唯一值的groupby计数?

时间:2019-07-05 18:25:46

标签: pandas-groupby

我有一个熊猫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)

  1. 阿森纳是主队。
  2. 阿森纳是客队。

还有。阿森纳参与了多少场主场和客场比赛,而他们和/或对方球队均未进球。 (防弹少年团= N)

我们希望20个团队中的每一个都具有相同的摘要。

请注意,我认为在此计算中不需要布尔条件,因为每个匹配项的BTS值Y或N已在原始数据集中导出。我只希望每个家庭(无论在家还是在外)的Y和N分组计数。

有没有人知道获得此摘要的方法比完成上述所有步骤更快?

0 个答案:

没有答案