2013-02-19 4 views
0

이 문제의 동기는 레코드 중복 제거를하려는 것입니다. 일부 필드는 삭제할 수 있지만 다른 필드의 합계를 원합니다. 다음 dataframe를 들어 ,변환 전후의 Pandas groupby 인덱싱

In [48]: rand = np.random.RandomState(1) 
     df = pd.DataFrame({'A': ['foo', 'bar'] * 2 + ['baz', 'qux'], 
             'B': rand.randn(6), 
             'C': rand.randint(0, 20, 6), 
     }) 
In [49]: df.sort('A', inplace=1) 
Out[49]:  A   B C 
     1 bar -0.611756 18 
     3 bar -1.072969 10 
     4 baz 0.865408 14 
     2 foo -0.528172 11 
     0 foo 1.624345 5 
     5 qux -2.301539 18 

나도 같은 A 값으로 기록을 중복 제거하지만 (어떤 경우에는 아마 C) B의 합을 유지하고 싶습니다.

In [50]: df.groupby('A')[['B']].transform(sum) 
Out[50]:   B 
     1 -1.684725 
     3 -1.684725 
     4 0.865408 
     2 1.096174 
     0 1.096174 
     5 -2.301539 

을하지만 어떤 이유로, 내가 마지막에 I 인덱스 때 내가 원하는 걸 포기하지 않는주의 : 나는 GROUPBY 년대 내가하고 싶은 일을해야 변환 생각

In [51]: df.groupby('A').transform(sum)[['B']] 
Out[51]:   B 
     1 -0.611756 
     3 -1.072969 
     4 0.865408 
     2 -0.528172 
     0 1.624345 
     5 -2.301539 

왜 거기 차이? 내가 2 열을 변환 할 때 또한, 그것이 내가 무엇을 기대하지 않습니다

In [52]: df.groupby('A')[['B', 'C']].transform(sum) #same result as df.groupby('A').transform(sum)[['B', 'C']] 
Out[52]:   B C 
     1 -0.611756 18 
     3 -1.072969 10 
     4 0.865408 14 
     2 -0.528172 11 
     0 1.624345 5 
     5 -2.301539 18 

내가이 상황에서 불일치를 신경 쓰지 않지만, 응용 프로그램에서 내가 일하고 있어요, 사실입니다 반대로,하지만 그것을 재현하는 예제를 찾을 수 없습니다 (즉, df.groupby('A').transform(sum)[['B', 'C']] 내가 원하는 것을 제공하지만 더 빠른 df.groupby('A')[['B', 'C']].transform(sum) 않습니다).

+0

내 생각에 변환 대상의 차원과 관련이 있습니다. 첫 번째 예에서는 합계 할 하나의 열을 선택합니다. 두 번째 단계에서는 그룹 전체를 합산 한 다음 B 열을 선택합니다. 변환 메카닉은 다소 신비하며 동의합니다. – Zelazny7

답변

0

나는 그것이 transform 방법에 있다고 생각한다. documentation을 보면 transform은 그룹화 된 것과 동일한 (동일한 크기) 색인화 된 개체를 반환합니다. 실제로 귀하의

df.groupby('A').transform(sum)[['B']] 

전혀 합계가 없습니다.

모두 당신이 필요 합이 경우,이 :

df.groupby('A')[['B']].sum() 

나이 :

df.groupby('A').sum()[['B']] 

이해야 할 그들이 동일한 결과를 생성합니다.

+0

원본 데이터 프레임과 동일한 모양을 원합니다. '[50]은 내가 원하는 결과물을 주었고, 왜 '51'이 그렇게 좋지 않은지 궁금합니다. – beardc

+0

재현 가능한 예를 들어 주시겠습니까? 더 쉽게 도와 드릴 수 있습니까? – statquant

+0

위의 코드를 재현 할 수 없다는 것을 이해하지 못합니까? 나의 주요 질문은 위에 나온 '50'과 '51'사이의 불일치에 관한 것인데, 나는 같은 출력을 낼 것으로 기대했다. 내가 더 분명히해야 할 것이 있습니까? – beardc

관련 문제