当有多个GroupBy列时,如何只求和第一个GroupBy列中每个组的第一个元素?

时间:2018-07-25 06:38:11

标签: python pandas pandas-groupby

我对熊猫还比较陌生,在基于汇总的groupby创建新列时遇到困难。

这是我的数据集的摘要:

In [1478]: mkt_vals_joined[['GameId', 'Year', 'HomeTeam', 'attMktValH']].head(10)
Out[1478]: 
   GameId  Year       HomeTeam  attMktValH
0       1  2005       West Ham       18.50
1       2  2005    Aston Villa       31.85
2       3  2005        Everton       31.38
3       4  2005         Fulham        6.45
4       5  2005       Man City       30.80
5       6  2005  Middlesbrough       43.20
6       7  2005     Portsmouth       30.70
7       8  2005     Sunderland        5.80
8       9  2005        Arsenal       88.75
9      10  2005          Wigan        9.80

它具有直到2018年的数据。attMktValH列是特定年份某支球队的进攻值。例如,以下代码显示了阿森纳每年进攻的价值:

In [1483]: mkt_vals_joined.groupby(['HomeTeam', 'Year'])['attMktValH'].first()
Out[1483]: 
HomeTeam          Year
Arsenal           2005     88.75
                  2006     77.25
                  2007     42.45
                  2008     92.50
                  2009    102.50
                  2010    110.30
                  2011    149.50
                  2012     85.50
                  2013     76.90
                  2014    129.65
                  2015    125.00
                  2016    143.50
                  2017    238.00
                  2018    176.70

我的问题是我需要在原始数据框中为每场比赛创建一列,该列是联盟每年进攻总值的百分比。

例如,阿森纳在2005年的价值为88.75,整个联盟的价值约为820,因此对于2005年的每场阿森纳比赛,其价值均为88.75 / 820 * 100

如果我简单地将Year和Team的分组相加,它将对每个游戏进行合计,并给我错误的结果。

我当前用于执行此操作的代码如下:

home_mkt_vals['attMkt%'] = home_mkt_vals['attMktValH'] / home_mkt_vals.groupby(['Year'])['attMktValH'].transform(lambda x: np.mean(x) * 20) * 100

但是,这对我来说似乎非常丑陋,并且只能起作用,因为每个赛季有20支球队。

谢谢您的帮助。

0 个答案:

没有答案