그룹의 순서를 유지하고 그룹 내에서 정렬하는 방법을 알아보겠습니다.
예제
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 구매 페이지
'판다스 > 판다스 팁' 카테고리의 다른 글
[pandas] 기존 열을 수정하면서 새로운 열도 추가하는 방법 (0) | 2024.05.22 |
---|---|
[pandas] 기존 데이터 프레임의 상위 2행을 멀티 인덱스로 설정하기 (0) | 2024.05.22 |
[pandas] 날짜가 속한 분기의 마지막 날 구하기 (0) | 2024.03.30 |
[pandas] 정렬시 매개 변수 key에 열마다 다른 함수 할당하기 (0) | 2024.03.29 |
[pandas] AAA → AA → A → BBB순으로 정렬하기 (0) | 2024.03.28 |