예제
import pandas as pd
data1 = {
'지점': ['서초점', '서초점', '양재점', '양재점', '서초점', '양재점'],
'제품': ['환타', '콜라', '콜라', '사이다', '사이다', '콜라'],
'매출': [7000, 9000, 5000, 1000, 2000, 4000]
}
df = pd.DataFrame(data1)
정렬 문제
1. 지점을 서초→양재 순으로 먼저 정렬하고
2. 제품은 콜라→환타→사이다 순으로 정렬하고
3. 지점과 제품이 동일할 때는 매출이 적은 순서로 정렬하라
먼저 지점과 제품의 정렬 순서로 카테고리를 생성하는 코드를 만들어
지점과 제품 열에만 적용하면 됩니다.
# 정렬 순서
order = ['서초점', '양재점', '콜라', '환타', '사이다']
# 지점과 제품열만 카테고리인 것처럼 정렬
out = df.sort_values(
['지점', '제품', '매출'],
key=lambda x: pd.Categorical(x, categories=order, ordered=True)
if x.name in ['지점', '제품'] else x
)
혹은 if문 대신 딕셔너리를 생성해 get 함수를 사용할 수도 있습니다.
# 정렬 순서
order = ['서초점', '양재점', '콜라', '환타', '사이다']
# 카테고리형으로 정렬 함수 생성
sorter = lambda s: pd.Categorical(s, categories=order, ordered=True)
# 지점과 제품 열만 sorter 함수로 정렬
out = df.sort_values(
['지점', '제품', '매출'],
key=lambda x: {'지점': sorter, '제품': sorter}.get(x.name, lambda s: s)(x)
)
out:
sort_values의 매개변수 key를 사용해 카테고리로 변환하는 함수를 입력하면
실제로 카테고리로 변환되지는 않고 카테고리인 것과 같이 정렬만 수행합니다.
'판다스 > 판다스 팁' 카테고리의 다른 글
[pandas] AAA → AA → A → BBB순으로 정렬하기 (0) | 2024.03.28 |
---|---|
[pandas] 특정 대상만 끌어 올려 정렬하기 (0) | 2024.03.28 |
[pandsa] NaN 위치에 데이터를 끌어 올리는 방법 (0) | 2024.03.19 |
[pandas] datetime을 연도와 쿼터를 표기하는 문자열로 변환하고 싶을 때 (0) | 2024.03.18 |
[pandas] NaN이 포함된 열에서 정수를 유지하는 방법 (0) | 2024.02.27 |