Python:函数返回重复值

时间:2017-11-30 19:05:57

标签: python function pandas duplicates

所以我创建了一个看起来像这样的测试数据集

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行。

出了什么问题,或者我该如何解决这个问题?

1 个答案:

答案 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