파이썬 pandas 정렬 가이드, sort_values와 sort_index로 여러 키와 na_position kind까지 한 번에 정복
🧭 여러 컬럼 다중 정렬부터 결측치 위치와 정렬 알고리즘 선택까지 실무 패턴으로 익히는 판다스 정렬
데이터를 다뤄보면 정렬만 잘해도 분석 흐름이 훨씬 또렷해진다는 걸 실감하게 됩니다.
pandas에서는 sort_values와 sort_index가 그 역할을 맡고 있고, 여러 키로 정렬하거나 결측치를 위아래 어디에 둘지, 어떤 정렬 알고리즘을 쓸지까지 세밀하게 조절할 수 있습니다.
이 글은 함수의 차이를 헷갈리지 않도록 정리하고, na_position과 kind 옵션을 활용하는 모범 패턴을 실제 코드와 함께 풀어냅니다.
복잡한 옵션을 단번에 이해할 수 있도록 매개변수의 의미와 선택 기준도 친근한 예시로 설명합니다.
특히 여러 컬럼(다중 키) 정렬은 보고서 표 정렬부터 피처 엔지니어링, 로그 데이터 시간축 정렬까지 폭넓게 쓰입니다.
결측치를 맨 위로 올릴지 아래로 내릴지도 분석 의도를 반영해야 하는데, na_position 한 줄로 명확히 결정할 수 있습니다.
또한 정렬의 성능과 안정성은 kind가 좌우하는데, 어떤 상황에서 어떤 알고리즘을 고르는 게 좋은지 실전 관점으로 설명합니다.
불필요한 시행착오 없이 빠르게 적용하도록 체크리스트와 코드 조각도 함께 담았습니다.
📋 목차
🔗 sort_values와 sort_index 차이와 사용 시점
pandas에서 정렬은 크게 데이터의 값을 기준으로 하는 방식과 라벨(인덱스)을 기준으로 하는 방식으로 나뉩니다.
sort_values는 행이나 열의 실제 값에 따라 순서를 바꾸고, sort_index는 인덱스 또는 컬럼 이름의 사전식(또는 지정한 레벨) 순서에 따라 재배치합니다.
보고서 표를 만들거나 랭킹을 구할 때는 보통 값 기준 정렬이 필요하고, 시계열처럼 날짜 인덱스를 정렬하거나 멀티인덱스 계층을 정리하려면 라벨 기준 정렬이 더 적합합니다.
두 함수 모두 공통적으로 ascending, axis, na_position, kind 같은 옵션을 제공해 세부 동작을 정밀하게 제어할 수 있습니다.
🧭 언제 sort_values를 쓰고, 언제 sort_index를 쓸까
| 상황 | 추천 함수 |
|---|---|
| 매출, 점수, 날짜열 등 열 값으로 랭킹/정렬 | sort_values(by=…) |
| DatetimeIndex, 카테고리 라벨, 멀티인덱스 라벨 정렬 | sort_index(level=…) |
| 여러 컬럼을 결합한 다중 키 정렬 | sort_values(by=[…], ascending=[…]) |
🔧 핵심 파라미터 빠르게 이해하기
- 🧱by: sort_values에서 정렬 기준이 되는 컬럼명(또는 리스트). Series에서는 생략 가능.
- ↔️axis: 0은 행을 재배치(열 값을 기준), 1은 열을 재배치(행 값을 기준).
- ⬆️⬇️ascending: bool 또는 리스트로 오름차순/내림차순을 키별로 지정.
- ⛳na_position: 결측치 위치를 first 또는 last로 지정.
- 🧩kind: 정렬 알고리즘 선택(예: quicksort, mergesort, heapsort, stable). 안정 정렬이 필요하면 mergesort 또는 stable.
import pandas as pd
# 값 기준 정렬: 매출 내림차순, 동률일 때 날짜 오름차순
df_sorted = df.sort_values(
by=["sales", "date"],
ascending=[False, True],
na_position="last", # 결측치는 아래로
kind="mergesort" # 동률 보존(안정 정렬) 필요할 때 권장
)
# 라벨(인덱스) 기준 정렬: 멀티인덱스의 상위 레벨을 우선 정렬
idx_sorted = df.sort_index(
axis=0, # 행 인덱스 기준
level=[0, 1], # 다중 레벨 순서 지정
ascending=[True, True],
sort_remaining=True # 지정하지 않은 레벨은 뒤에서 정렬
)
💡 TIP: 값 정렬에서 동률의 기존 순서를 유지해야 한다면 kind=”mergesort” 또는 kind=”stable”을 선택하면 안전합니다.
멀티인덱스는 sort_index(level=…)로 상·하위 레벨을 명시하면 의도치 않은 재배치를 막을 수 있습니다.
⚠️ 주의: 여러 컬럼을 정렬할 때 ascending을 리스트로 주지 않으면 모든 키가 동일 방향으로만 정렬됩니다.
또한 na_position은 결측치의 상대적 위치만 바꿀 뿐, 데이터의 값 자체를 치환하진 않습니다.
💬 값 정렬은 by가 핵심이고, 라벨 정렬은 level의 명시가 포인트입니다.
둘을 혼동하지 않으면 대부분의 정렬 문제는 자연스럽게 해결됩니다.
🧩 여러 키로 정렬하기와 오름차순 내림차순 혼합
데이터프레임을 다루다 보면 단일 컬럼이 아닌 여러 키를 기준으로 정렬할 필요가 자주 생깁니다.
예를 들어, 부서별 급여 데이터를 다룬다고 가정할 때 부서를 기준으로 정렬한 뒤, 같은 부서 내에서는 급여를 내림차순으로 정렬하는 방식입니다.
이때 pandas의 sort_values는 by 인자에 리스트를 전달해 손쉽게 다중 키 정렬을 지원합니다.
🔀 오름차순과 내림차순을 섞어 정렬하기
특정 컬럼은 오름차순으로, 또 다른 컬럼은 내림차순으로 정렬해야 할 때는 ascending에 리스트를 지정하면 됩니다.
리스트의 순서는 by에서 지정한 컬럼 순서와 일치해야 합니다.
import pandas as pd
data = {
"부서": ["인사", "개발", "개발", "영업", "인사", "영업"],
"이름": ["김철수", "이영희", "박민수", "최지훈", "정다은", "한상우"],
"급여": [350, 500, 450, 400, 370, 390]
}
df = pd.DataFrame(data)
# 부서는 오름차순, 같은 부서 내에서는 급여 내림차순
df_sorted = df.sort_values(
by=["부서", "급여"],
ascending=[True, False]
)
print(df_sorted)
📌 다중 키 정렬 시 체크할 점
- 🧱by와 ascending의 길이가 다르면 오류 발생
- ⚡값이 동일한 경우 다음 키 순서대로 정렬이 적용
- ⏱️컬럼 수가 많을수록 성능에 영향을 줄 수 있어 필요한 경우에만 사용 권장
💬 보고서 작성이나 그룹별 데이터 분석 시 다중 키 정렬은 가독성과 분석 효율을 크게 높여줍니다.
💎 핵심 포인트:
다중 키 정렬에서는 반드시 각 키별 정렬 방향을 리스트로 지정해야 하며, 데이터의 맥락에 따라 오름차순과 내림차순을 혼합하는 것이 중요합니다.
↕️ na_position으로 결측치 위치 제어
데이터 분석 과정에서는 결측치가 반드시 등장합니다.
정렬할 때 이 결측치를 어디에 둘 것인지는 분석 목적에 따라 달라집니다.
예를 들어, 매출 데이터를 내림차순으로 정렬했을 때 결측치가 맨 위에 있으면 가독성이 떨어질 수 있습니다.
반대로 데이터 품질 검증 단계에서는 결측치를 맨 위로 모아 한눈에 확인하는 것이 편리합니다.
이때 na_position 옵션을 사용하면 손쉽게 제어할 수 있습니다.
📌 na_position 옵션의 두 가지 값
| 옵션 값 | 설명 |
|---|---|
| first | 결측치를 최상단 또는 최좌측에 배치 |
| last | 결측치를 최하단 또는 최우측에 배치 (기본값) |
import pandas as pd
import numpy as np
data = {"이름": ["김철수", "이영희", "박민수", "최지훈"],
"점수": [85, np.nan, 92, np.nan]}
df = pd.DataFrame(data)
# 결측치를 맨 위에 배치
df_first = df.sort_values(by="점수", na_position="first")
# 결측치를 맨 아래에 배치 (기본값)
df_last = df.sort_values(by="점수", na_position="last")
📌 활용 예시
- 📝데이터 검증 시 결측치가 있는 행을 위로 모아 빠르게 확인
- 📊리포트 작성 시 결측치는 맨 아래로 보내어 가독성 유지
- 🔍데이터 전처리 단계에서 결측치 클러스터를 집중 관리
💎 핵심 포인트:
na_position은 결측치의 상대적 위치만 조절할 뿐, 결측값을 대체하거나 수정하지는 않습니다. 데이터 품질 관리와 분석 목적에 맞게 위치를 선택하는 것이 중요합니다.
⚠️ 주의: na_position은 sort_values와 sort_index 모두에서 사용 가능하지만, 결측치가 라벨에 있는 경우에는 기대와 다른 결과가 나올 수 있으니 반드시 확인해야 합니다.
⚡ kind 옵션과 안정 정렬의 의미
pandas의 sort_values와 sort_index 함수는 내부적으로 NumPy의 정렬 알고리즘을 사용합니다.
이때 어떤 알고리즘을 선택하느냐에 따라 속도와 안정성이 달라집니다.
기본적으로는 quicksort가 쓰이지만, 필요에 따라 mergesort, heapsort, stable을 지정할 수 있습니다.
🔎 kind 옵션별 특징
| 옵션 | 특징 | 권장 상황 |
|---|---|---|
| quicksort | 빠른 속도의 분할 정복 알고리즘 | 일반적인 단일 컬럼 정렬 |
| mergesort | 안정 정렬 (Stable Sort) | 다중 키 정렬, 기존 순서 유지 필요 |
| heapsort | 힙 구조 기반, 안정성 없음 | 특정 성능 테스트 상황 |
| stable | mergesort와 동일, 가독성을 위해 제공 | 안정 정렬을 의도적으로 명시할 때 |
import pandas as pd
df = pd.DataFrame({
"팀": ["A", "A", "B", "B"],
"점수": [90, 90, 85, 85],
"이름": ["철수", "영희", "민수", "지훈"]
})
# mergesort를 쓰면 점수가 같은 경우 기존 순서 유지
sorted_df = df.sort_values(by="점수", kind="mergesort")
📌 안정 정렬이 중요한 이유
안정 정렬은 동률 데이터가 있을 때 원래 순서를 유지해줍니다.
예를 들어 점수가 같은 학생 리스트를 이름순으로 나중에 다시 정렬하고 싶을 때 안정 정렬을 써야 이전 정렬 순서가 보존됩니다.
이 특성은 다중 정렬이나 보고서 작성 시 매우 중요합니다.
💎 핵심 포인트:
성능 중심이면 quicksort, 순서 보존이 필요하면 mergesort 또는 stable을 사용하는 것이 정석입니다.
⚠️ 주의: 안정 정렬을 쓰지 않으면 같은 값의 행들이 예상치 못한 순서로 섞일 수 있어 결과가 달라질 수 있습니다.
🗂️ sort_index로 행과 열 라벨 정렬하기
pandas에서 인덱스와 컬럼 라벨은 단순한 이름이 아니라 데이터 탐색과 연산에 중요한 역할을 합니다.
따라서 라벨을 정렬하는 일은 데이터프레임을 체계적으로 관리하는 핵심 단계입니다.
sort_index는 행 인덱스 또는 열 라벨을 정렬할 수 있도록 도와주며, 멀티인덱스 구조에서도 원하는 레벨을 선택해 유연하게 정렬할 수 있습니다.
📌 기본 사용법
import pandas as pd
data = {"매출": [300, 250, 400],
"고객수": [20, 15, 25]}
df = pd.DataFrame(data, index=["지점C", "지점A", "지점B"])
# 인덱스 기준 오름차순 정렬
df_sorted = df.sort_index()
# 인덱스 기준 내림차순 정렬
df_desc = df.sort_index(ascending=False)
# 열 라벨 기준 정렬
df_cols = df.sort_index(axis=1)
위 예시처럼 axis를 0으로 두면 행 인덱스 기준, 1로 두면 컬럼 라벨 기준 정렬이 이루어집니다.
이때도 ascending과 na_position 옵션을 함께 활용할 수 있습니다.
📌 멀티인덱스에서 sort_index 활용
멀티인덱스를 사용할 때는 level을 지정하여 특정 계층만 정렬할 수 있습니다.
또한 sort_remaining 옵션을 통해 지정하지 않은 레벨의 정렬 여부를 제어할 수 있습니다.
arrays = [
["서울", "서울", "부산", "부산"],
["A지점", "B지점", "A지점", "B지점"]
]
index = pd.MultiIndex.from_arrays(arrays, names=("도시", "지점"))
df_multi = pd.DataFrame({"매출": [100, 200, 150, 180]}, index=index)
# 도시 레벨만 정렬
df_level = df_multi.sort_index(level="도시")
# 지점 레벨만 정렬
df_branch = df_multi.sort_index(level="지점")
💎 핵심 포인트:
sort_index는 데이터의 순서를 정리하는 것뿐 아니라, 멀티인덱스 구조에서 원하는 레벨을 선택적으로 정렬할 수 있다는 점이 강력합니다.
⚠️ 주의: 멀티인덱스 정렬 시 level을 지정하지 않으면 모든 레벨이 함께 정렬되므로 원치 않는 순서 변경이 발생할 수 있습니다.
💬 정렬의 출발점은 값 기준이 아닌 인덱스 기준일 때가 많습니다.
특히 시계열 데이터에서는 날짜 인덱스를 정렬하는 것이 분석의 첫 단추입니다.
❓ 자주 묻는 질문 (FAQ)
sort_values와 sort_index의 가장 큰 차이는 무엇인가요?
여러 컬럼을 동시에 정렬하려면 어떻게 해야 하나요?
na_position 옵션은 어떤 상황에서 유용한가요?
kind에서 mergesort와 stable은 다른 건가요?
정렬 시 기존 순서가 유지되지 않는 이유는 뭔가요?
멀티인덱스 정렬은 어떻게 하나요?
sort_values와 groupby를 함께 쓰는 경우 주의할 점은 무엇인가요?
정렬 속도를 높이는 방법이 있나요?
📝 pandas 정렬 옵션 완벽 이해와 활용 가이드
pandas에서 데이터를 정렬하는 방법은 단순히 보기 좋게 배열하는 차원을 넘어 데이터 분석과 가공의 기초가 됩니다.
이번 글에서 살펴본 sort_values와 sort_index의 차이, 다중 키 정렬, na_position을 활용한 결측치 위치 제어, kind 옵션을 통한 정렬 알고리즘 선택까지 모두 실무에서 반드시 알아두어야 할 포인트입니다.
라벨 기반 정렬과 값 기반 정렬을 구분해 쓰면 복잡한 데이터셋에서도 원하는 순서를 정확히 구현할 수 있고, 안정 정렬 옵션을 적절히 활용하면 동률 값에서도 의도한 순서를 유지할 수 있습니다.
특히 다중 키 정렬은 보고서 작성이나 그룹별 분석 시 필수적이며, 결측치의 위치를 명확히 지정해두면 분석 단계에서 혼란을 줄일 수 있습니다.
또한 멀티인덱스 정렬 기능은 계층적 데이터를 다룰 때 강력한 도구가 됩니다.
정리하자면, pandas의 정렬 기능을 정확히 이해하고 옵션을 적재적소에 활용하는 것이 데이터 분석 효율을 높이는 가장 확실한 방법입니다.
🏷️ 관련 태그 : pandas정렬, sort_values, sort_index, na_position, kind옵션, 데이터분석, 파이썬코딩, 멀티인덱스, 데이터전처리, 데이터사이언스