我有一个以下形式的 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/