所以我创建了一个看起来像这样的测试数据集
INDEX YEAR_ID GAME_ID BAT_TEAM_ID INN_CT EVENT_CD INN_PA_CT wBB wHBP w1B
0 2016 1 ANN 1 1 0 0.691 0.721 0.878
1 2016 1 ANN 1 3 1 0.691 0.721 0.878
2 2016 1 ANN 2 3 0 0.691 0.721 0.878
3 2016 1 ANN 2 1 1 0.691 0.721 0.878
4 2016 1 CLE 2 2 0 0.691 0.721 0.878
5 2016 1 CLE 2 2 1 0.691 0.721 0.878
6 2016 2 KCA 1 1 0 0.691 0.721 0.878
7 2016 2 KCA 1 1 1 0.691 0.721 0.878
8 2016 2 KCA 1 3 2 0.691 0.721 0.878
9 2016 2 KCA 1 2 3 0.691 0.721 0.878
10 2016 2 TEX 1 1 0 0.691 0.721 0.878
11 2016 2 TEX 1 1 1 0.691 0.721 0.878
12 2016 2 TEX 1 2 2 0.691 0.721 0.878
13 2016 2 TEX 1 1 3 0.691 0.721 0.878
14 2016 2 KCA 2 2 0 0.691 0.721 0.878
15 2016 2 KCA 2 2 1 0.691 0.721 0.878
并且我已经定义了一个计算某些统计量的函数:
def woba(x):
return ((((x['EVENT_CD'] == 1).sum() * x['wBB']) +
((x['EVENT_CD'] == 2).sum() * x['wHBP']) +
((x['EVENT_CD'] == 3).sum() * x['w1B'])) / (x['INN_PA_CT'].max()))
stat = df.groupby(['BAT_TEAM_ID', 'GAME_ID', 'INN_CT']).apply(woba)
stat = stat.reset_index(level = ['BAT_TEAM_ID', 'GAME_ID', 'INN_CT'])
stat.columns = ['BAT_TEAM_ID', 'GAME_ID', 'INN_CT', 'wOBA']
并且函数有效,它返回我想要的值,但由于某种原因,结果中存在重复
INDEX BAT_TEAM_ID GAME_ID INN_CT wOBA
0 ANN 1 1 1.569
1 ANN 1 1 1.569
2 ANN 1 2 1.569
3 ANN 1 2 1.569
4 CLE 1 2 1.442
5 CLE 1 2 1.442
6 KCA 2 1 0.993666667
7 KCA 2 1 0.993666667
8 KCA 2 1 0.993666667
9 KCA 2 1 0.993666667
14 KCA 2 2 1.442
15 KCA 2 2 1.442
10 TEX 2 1 0.931333333
11 TEX 2 1 0.931333333
12 TEX 2 1 0.931333333
13 TEX 2 1 0.931333333
什么时候应该只有6行。
出了什么问题,或者我该如何解决这个问题?
答案 0 :(得分:0)
问题是你的公式没有返回单个标量数字,但它返回一个系列,因为你的组有多个wBB,wHBP和w1B的值(多次相同的数字)。
解决此问题的一种方法是在每个之后添加.max()以仅获取一个值,因为该值在组中相同,您可以使用.max()或.first()。
或者你可以简单地最大化结果。
def woba(x):
result = ((((x['EVENT_CD'] == 1).sum() * x['wBB']) +
((x['EVENT_CD'] == 2).sum() * x['wHBP']) +
((x['EVENT_CD'] == 3).sum() * x['w1B'])) / (x['INN_PA_CT'].max()))
return result.max()
df.groupby(['BAT_TEAM_ID', 'GAME_ID', 'INN_CT']).apply(lambda x: woba(x))
输出:
BAT_TEAM_ID GAME_ID INN_CT
ANN 1 1 1.569000
2 1.569000
CLE 1 2 1.442000
KCA 2 1 0.993667
2 1.442000
TEX 2 1 0.931333
dtype: float64