본문 바로가기
판다스/판다스 팁

[pandas] 그룹의 순서를 유지하고 그룹 내에서 정렬하기

by 김판다t 2024. 5. 13.

그룹의 순서를 유지하고 그룹 내에서 정렬하는 방법을 알아보겠습니다.

 

 

예제

 

 

import pandas as pd
data1 = {'col1': ['A', 'A', 'A', 'B', 'B', 'B', 'B'], 
         'col2': ['가', '가', '나', '나', '나', '가', '가'], 
         'col3': [9, 7, 2, 8, 6, 1, 2]}

df = pd.DataFrame(data1)

 

 

오늘의 목표

 

 

 

솔루션

 

중복값을 제거해 각 그룹을 넘버링한 후에 기존 df에 넘버링을 병합하고 정렬에 사용합니다.

사용 후 정렬용 열인 sort 열은 삭제합니다.

out = (df
       .merge((df.drop('col3', axis=1)
               .drop_duplicates()
               .assign(sort=lambda x: range(len(x)))
              ), 
              how='left')
       .sort_values(['sort', 'col3'])
       .drop('sort', axis=1)
)
out

 

 

이것도 가능한 방법이지만 정렬용 열을 생성했다가 삭제하는 것은 고급 솔루션은 아닙니다.

 

 

 

 

고급 솔루션

 

 

방법1.

 

sort_values 함수의 매개변수 key와 groupby + ngroups 를 활용합니다.

out = df.sort_values(
    ['col1', 'col3'], 
    key=lambda x: x.groupby([df['col1'], df['col2']], sort=False).ngroup() 
                  if x.name == 'col1' else x
)

 

 

 

방법2.

 

혹은 사용자 정의 함수를 생성해서 groupby + apply로 적용해 각 그룹내에서만 정렬을 수행합니다.

def sorter(d):
    return d.sort_values('col3')
out = df.groupby(['col1', 'col2'], group_keys=False, sort=False).apply(sorter)

 

 

둘 다 판다스의 숙련자만 사용할 수 있는 기법이며 방법1이 더 효율적입니다.

 


 

교보문고 구매 페이지, 알라딘 구매 페이지yes24 구매 페이지