2017-11-30 1 views
1

그래서 나는이파이썬 : 기능 반환 중복

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 

wh 6 행만 있어야합니다.

무엇이 잘못 되었습니까, 아니면 어떻게 해결할 수 있습니까?

+0

음, 왜 그것이 단지 6 행해야한다고 생각합니까? 당신은 데이터 프레임을 반환하는 함수를'.apply'로 집계하고 데이터에서 볼 수 있듯이'wBB wHBP w1B'가 반복됩니다 ... –

+0

각 팀의 통계를 계산하려고합니다. 게임 당, 이닝당. 인덱스 0과 1은 같은 팀, 게임 및 이닝에 대해 동일한 값을 가지며 인덱스 2와 3도 마찬가지입니다. 가장 중복되는 것은 인덱스 6-9입니다. 'wBB, wHBP, w1B'는 다른 액션에 대한 가중치이며 해마다 바뀌어 계산을 위해 데이터 프레임과 병합됩니다. – Justin

+0

글쎄, 당신의 기능이 무엇인지 모르겠다. 그 수준에서 고칠 수 있지만, 언제나'.drop_duplicates()'를 추가 할 수있다. –

답변

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