티스토리 뷰

발생일: 2018.10.19

키워드: pands, 판다스, groupby, nlargest, nsmallest, sort_values, get n largest value in group

문제:

그룹 내에서 값이 큰 순으로 상위 n개만 가져오려고 한다.


해결책:

이 용도의 nlargestnsmallest API를 제공하고 있다.

하지만, 가장 빠른 방법은 데이터프레임을 원하는 값으로 정렬한 후에 groupby 하고, head 로 가져오는 것이다.

id, name, total 로 구성된 데이터프레임이 있고, 각 name의 값을 total 로 정렬해 상위 3개만 가져오고 싶다면 아래와 같이 처리하는 것이 빠르다.


    df.sort_values(by='total', ascending=False).groupby('name').head(3)


DataFrame.groupby 문서에 의하면,

sort : boolean, default True
    Sort group keys. Get better performance by turning this off.
    Note this does not influence the order of observations within each group.
    groupby preserves the order of rows within each group.

그룹 내 행의 순서가 유지되기 때문에 안전하다.

그룹 자체의 정렬이 필요하지 않다면, sort 옵션을 끄면 좀 더 빠르다.


    df.sort_values(by='total', ascending=False).groupby('name', sort=False).head(3)


논의:

nlargest 를 사용해 동일하게 아래와 같이 처리해도 된다.

    df.groupby('name').apply(lambda x: x.nlargest(3, 'total'))


하지만, 약 150만개 행으로 테스트했을 때, 첫 번째 방법은 200ms 근처로 실행됐지만, 두 번째 방법은 40초 이상 걸렸다.


참고:





반응형
댓글
공지사항