python - Pandas 对多列进行分组并将结果广播到原始数据帧

标签 python pandas pandas-groupby

我有一个以下形式的 pandas 数据框:

      bowler    inning  wickets Total_wickets   matches balls
0   SL Malinga     1      69         143          44    4078
1   SL Malinga     2      74         143          54    4735
2   A Mishra       1      48         124          50    3908
3   A Mishra       2      76         124          62    4930
4   DJ Bravo       1      61         122          48    3887

我想在“bowler”和“inning”上对此 df 进行分组,并对“wickets”和“balls”列执行一些计算,然后将其广播到与新列相同的 df。 我尝试的方法之一是使用转换,例如:

df_bowler['strike rate'] = df_bowler.groupby(['bowler','inning']).transform(lambda x : x['balls']/x['wickets'])

这会导致 keyError 异常:

KeyError: ('balls', 'occurred at index wickets')

我通过使用 apply 和 merge 来完成我需要的操作,例如:

df_strRate = df_bowler.groupby(['bowler','inning']).apply(lambda x:x['balls']/x['wickets']).reset_index(level=2,drop=True).reset_index(name='strike rate')
df_bowler = df_bowler.merge(df_strRate,on=['bowler','inning'])

但是,这似乎是一种迂回的做法。我想知道为什么在这种情况下转换会失败。有什么指点吗?

谢谢。

最佳答案

您的转换失败,因为您沿着错误的轴应用它,并且您需要首先使用诸如 sum() 之类的聚合。看看这个:

In [83]: df.groupby(['bowler', 'inning']).sum().transform(lambda x : x['balls'].astype(float)/x['wickets'].astype(float), axis=1)
Out[83]: 
bowler      inning
A Mishra    1         81.416667
            2         64.868421
DJ Bravo    1         63.721311
SL Malinga  1         59.101449
            2         63.986486
dtype: float64

但你也可以这样做:

In [88]: df['strike_rate'] = df.balls / df.wickets
In [89]: df
Out[89]: 
       bowler  inning  wickets  Total_wickets  matches  balls  strike_rate
0  SL Malinga       1       69            143       44   4078    59.101449
1  SL Malinga       2       74            143       54   4735    63.986486
2    A Mishra       1       48            124       50   3908    81.416667
3    A Mishra       2       76            124       62   4930    64.868421
4    DJ Bravo       1       61            122       48   3887    63.721311

关于python - Pandas 对多列进行分组并将结果广播到原始数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45604291/

相关文章:

python - 减去多列并将结果附加到 pandas DataFrame

python - 使用子图和循环按组绘制 Pandas

python - 将具有多列的 Pandas 数据框分组并创建分布

python - pygraphviz:使用后继查找最大等级节点

python - Matplotlib 缩放事件图例选择器未更新

python - 仅当四肢具有相同值并限制最大出现次数时,如何填补数据空白?

python - “OrderedDict”对象没有属性 'sort'

python - pandas 中的新列 - 通过应用列表 groupby 将系列添加到数据框

python - 不需要标签的一热编码?

python - 关于限制行长度以符合 PEP8 的不同方式的样式的一些建议