[Pandas] sort_values / sort_index
Pandas sort_values, Pandas sort_index, Pandas sort_values / sort_index, pandas 정렬
정의
sort_values(): 컬럼 값 기준 정렬sort_index(): index (행 또는 열 라벨) 기준 정렬
기본은 오름차순, ascending=False 로 내림차순.
sort_values 기본
python
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Dave'],
'age': [30, 25, 35, 28],
'salary': [5000, 4000, 6000, 4500],
})
print(df.sort_values('age'))
print('---')
print(df.sort_values('age', ascending=False)) 결과
name age salary
1 Bob 25 4000
3 Dave 28 4500
0 Alice 30 5000
2 Charlie 35 6000
---
name age salary
2 Charlie 35 6000
0 Alice 30 5000
3 Dave 28 4500
1 Bob 25 4000여러 컬럼 정렬
df.sort_values(['city', 'age'])
df.sort_values(['city', 'age'], ascending=[True, False])
# city 오름차순, 같은 city 안에서 age 내림차순
NaN 위치
df.sort_values('age', na_position='last') # 기본
df.sort_values('age', na_position='first')
NaN 은 비교 불가, 항상 끝 또는 처음에 배치.
stable sort
df.sort_values('age', kind='stable') # 같은 값의 상대 순서 유지
기본 kind='quicksort'. stable 이 필요한 경우 (multi-pass 정렬, 카테고리별 누적 순서 유지) stable 명시.
key 함수
# 대소문자 무시 정렬
df.sort_values('name', key=lambda s: s.str.lower())
# 절댓값 기준
df.sort_values('balance', key=lambda s: s.abs())
sort_index
df.sort_index() # 행 라벨 정렬
df.sort_index(axis=1) # 컬럼 이름 정렬
df.sort_index(ascending=False)
df.sort_index(level=0) # MultiIndex 의 특정 level
sorted 한 결과를 in-place 로
df = df.sort_values('age') # 사본 (권장)
df.sort_values('age', inplace=True) # in-place (느림, deprecated 방향)
TIP
새 pandas 에서는 in-place 가 더 빠르지 않다. 명시성 좋은 df = df.sort_values(...) 권장.
reset_index 와 함께
정렬 후 index 가 뒤섞이는 게 싫다면 reset_index(drop=True).
df_sorted = df.sort_values('age').reset_index(drop=True)
nlargest / nsmallest
상위/하위 N 개만 필요하면 sort 후 head 보다 nlargest / nsmallest 가 빠르다.
df.nlargest(3, 'salary') # 상위 3 명
df.nsmallest(3, 'salary') # 하위 3 명
df.nlargest(3, ['salary', 'age']) # 다중 키
함정
1. 정렬 후 index 가 섞임
df.sort_values('age')
# index 가 1, 3, 0, 2 같이 뒤섞임
# 그대로 .iloc[0] 하면 정렬 전 행이 옴
df.sort_values('age').reset_index(drop=True).iloc[0] # ✓
2. inplace=True 의 부작용
df.sort_values('age', inplace=True)
# 이후 모든 view 가 영향받음
# method chain 도 끊김 → 권장 안 함
3. 한글 정렬
기본은 유니코드 순. 한글의 사전순이 항상 직관적이지는 않다.
df.sort_values('name', key=lambda s: s.map(lambda x: x)) # 기본
# 사용자 정렬이 필요하면 별도 mapping
💬 댓글