본문으로 건너뛰기
김신건의 로그

[Pandas] sort_values / sort_index

· 수정 · 📖 약 1분 · 242자/단어 #python #pandas #sorting
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'])   # 다중 키

Pandas nlargest / rank 참고.

함정

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

참고

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기