2016-12-15 3 views
2

각 그룹마다 상위 내가 기록의 합을 기준으로 상위 N 레코드를 가져 오기 :팬더 :이 같은 팬더 dataframe이

>>> df 

    id value 
0 1  10 
1 1  11 
2 1  9 
3 2  7 
4 2  7 
5 2  8 
6 3  10 
7 3  8 

내가 정상이 ID를 얻으려면이의 합을 기준으로 그들의 상위 두 값.

id # value 
0 1 # 11 + 10 = 21 
1 3 # 10 + 8 = 18 

내가 사용하여 시도 :

df.groupby('id')['value'].nlargest(2).sum() 

을하지만 그 모든 가장 큰 값의 합계를 반환 그래서 여기 ,이를 얻어야한다.

내 질문에 대한 답변을 찾았지만 적절한 답변을 찾지 못했습니다.

답변

5

groupby.nlargest(2)는 MultiIndex으로 시리즈를 반환 여기

df.groupby('id')['value'].nlargest(2) 
Out: 
id 
1 1 11 
    0 10 
2 5  8 
    3  7 
3 6 10 
    7  8 
Name: value, dtype: int64 

, ID와 원래의 인덱스 둘 다 돌아 시리즈에 나타납니다. 이제 합계를 계산하면이 시리즈의 모든 값의 합계가됩니다. 그러나 레벨 = 0 (또는이 MultiIndex의 id 부분)에서 합계를 적용하면 각 ID에 대한 합계 만 따로 따로 가져옵니다.

df.groupby('id')['value'].nlargest(2).sum(level=0) 
Out: 
id 
1 21 
2 15 
3 18 
Name: value, dtype: int64 

이제 각 ID에 대해 두 개의 큰 값의 합계가 있습니다. 이 시리즈에서 가장 큰 두 값을 찾으려면 번으로 다시 전화해야합니다.

df.groupby('id')['value'].nlargest(2).sum(level=0).nlargest(2) 
Out: 
id 
1 21 
3 18 
Name: value, dtype: int64 
+0

감사합니다. 여기에 레벨이 무엇인지 설명해 주시겠습니까? – Barker

관련 문제