메뉴 닫기

파이썬 pandas 정렬 가이드, sort_values와 sort_index로 여러 키와 na_position kind까지 한 번에 정복

파이썬 pandas 정렬 가이드, sort_values와 sort_index로 여러 키와 na_position kind까지 한 번에 정복

🧭 여러 컬럼 다중 정렬부터 결측치 위치와 정렬 알고리즘 선택까지 실무 패턴으로 익히는 판다스 정렬

데이터를 다뤄보면 정렬만 잘해도 분석 흐름이 훨씬 또렷해진다는 걸 실감하게 됩니다.
pandas에서는 sort_valuessort_index가 그 역할을 맡고 있고, 여러 키로 정렬하거나 결측치를 위아래 어디에 둘지, 어떤 정렬 알고리즘을 쓸지까지 세밀하게 조절할 수 있습니다.
이 글은 함수의 차이를 헷갈리지 않도록 정리하고, na_positionkind 옵션을 활용하는 모범 패턴을 실제 코드와 함께 풀어냅니다.
복잡한 옵션을 단번에 이해할 수 있도록 매개변수의 의미와 선택 기준도 친근한 예시로 설명합니다.

특히 여러 컬럼(다중 키) 정렬은 보고서 표 정렬부터 피처 엔지니어링, 로그 데이터 시간축 정렬까지 폭넓게 쓰입니다.
결측치를 맨 위로 올릴지 아래로 내릴지도 분석 의도를 반영해야 하는데, 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.
CODE BLOCK
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_valuesby 인자에 리스트를 전달해 손쉽게 다중 키 정렬을 지원합니다.

🔀 오름차순과 내림차순을 섞어 정렬하기

특정 컬럼은 오름차순으로, 또 다른 컬럼은 내림차순으로 정렬해야 할 때는 ascending에 리스트를 지정하면 됩니다.
리스트의 순서는 by에서 지정한 컬럼 순서와 일치해야 합니다.

CODE BLOCK
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)

📌 다중 키 정렬 시 체크할 점

  • 🧱byascending의 길이가 다르면 오류 발생
  • 값이 동일한 경우 다음 키 순서대로 정렬이 적용
  • ⏱️컬럼 수가 많을수록 성능에 영향을 줄 수 있어 필요한 경우에만 사용 권장

💬 보고서 작성이나 그룹별 데이터 분석 시 다중 키 정렬은 가독성과 분석 효율을 크게 높여줍니다.

💎 핵심 포인트:
다중 키 정렬에서는 반드시 각 키별 정렬 방향을 리스트로 지정해야 하며, 데이터의 맥락에 따라 오름차순과 내림차순을 혼합하는 것이 중요합니다.



↕️ na_position으로 결측치 위치 제어

데이터 분석 과정에서는 결측치가 반드시 등장합니다.
정렬할 때 이 결측치를 어디에 둘 것인지는 분석 목적에 따라 달라집니다.
예를 들어, 매출 데이터를 내림차순으로 정렬했을 때 결측치가 맨 위에 있으면 가독성이 떨어질 수 있습니다.
반대로 데이터 품질 검증 단계에서는 결측치를 맨 위로 모아 한눈에 확인하는 것이 편리합니다.
이때 na_position 옵션을 사용하면 손쉽게 제어할 수 있습니다.

📌 na_position 옵션의 두 가지 값

옵션 값 설명
first 결측치를 최상단 또는 최좌측에 배치
last 결측치를 최하단 또는 최우측에 배치 (기본값)
CODE BLOCK
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_valuessort_index 모두에서 사용 가능하지만, 결측치가 라벨에 있는 경우에는 기대와 다른 결과가 나올 수 있으니 반드시 확인해야 합니다.

kind 옵션과 안정 정렬의 의미

pandas의 sort_valuessort_index 함수는 내부적으로 NumPy의 정렬 알고리즘을 사용합니다.
이때 어떤 알고리즘을 선택하느냐에 따라 속도와 안정성이 달라집니다.
기본적으로는 quicksort가 쓰이지만, 필요에 따라 mergesort, heapsort, stable을 지정할 수 있습니다.

🔎 kind 옵션별 특징

옵션 특징 권장 상황
quicksort 빠른 속도의 분할 정복 알고리즘 일반적인 단일 컬럼 정렬
mergesort 안정 정렬 (Stable Sort) 다중 키 정렬, 기존 순서 유지 필요
heapsort 힙 구조 기반, 안정성 없음 특정 성능 테스트 상황
stable mergesort와 동일, 가독성을 위해 제공 안정 정렬을 의도적으로 명시할 때
CODE BLOCK
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는 행 인덱스 또는 열 라벨을 정렬할 수 있도록 도와주며, 멀티인덱스 구조에서도 원하는 레벨을 선택해 유연하게 정렬할 수 있습니다.

📌 기본 사용법

CODE BLOCK
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로 두면 컬럼 라벨 기준 정렬이 이루어집니다.
이때도 ascendingna_position 옵션을 함께 활용할 수 있습니다.

📌 멀티인덱스에서 sort_index 활용

멀티인덱스를 사용할 때는 level을 지정하여 특정 계층만 정렬할 수 있습니다.
또한 sort_remaining 옵션을 통해 지정하지 않은 레벨의 정렬 여부를 제어할 수 있습니다.

CODE BLOCK
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의 가장 큰 차이는 무엇인가요?
sort_values는 데이터 값 자체를 기준으로 정렬하고, sort_index는 인덱스(행 또는 열 라벨)를 기준으로 정렬합니다.
여러 컬럼을 동시에 정렬하려면 어떻게 해야 하나요?
sort_values의 by 인자에 컬럼명을 리스트로 전달하고, ascending에도 리스트를 지정하면 됩니다. 예: ascending=[True, False]
na_position 옵션은 어떤 상황에서 유용한가요?
결측치를 맨 위로 모아 빠르게 확인하거나, 맨 아래로 내려서 보고서를 깔끔하게 정리할 때 유용합니다.
kind에서 mergesort와 stable은 다른 건가요?
기능적으로 동일하며 둘 다 안정 정렬을 보장합니다. stable은 가독성을 위해 제공된 별칭입니다.
정렬 시 기존 순서가 유지되지 않는 이유는 뭔가요?
기본 quicksort는 불안정 정렬이라 동률이 있는 경우 순서가 보장되지 않습니다. mergesort나 stable을 선택해야 합니다.
멀티인덱스 정렬은 어떻게 하나요?
sort_index에서 level 파라미터를 지정하면 특정 레벨만 정렬할 수 있습니다. sort_remaining으로 나머지 레벨의 정렬 여부도 제어할 수 있습니다.
sort_values와 groupby를 함께 쓰는 경우 주의할 점은 무엇인가요?
groupby 후에는 그룹별 정렬이 따로 적용되지 않으므로, apply나 transform과 함께 sort_values를 결합해야 원하는 결과를 얻을 수 있습니다.
정렬 속도를 높이는 방법이 있나요?
데이터 크기가 크다면 quicksort가 빠르며, 필요하지 않은 한 안정 정렬은 피하는 것이 속도에 유리합니다. 또, 인덱스가 잘 설정되어 있으면 sort_index가 효율적입니다.

📝 pandas 정렬 옵션 완벽 이해와 활용 가이드

pandas에서 데이터를 정렬하는 방법은 단순히 보기 좋게 배열하는 차원을 넘어 데이터 분석과 가공의 기초가 됩니다.
이번 글에서 살펴본 sort_valuessort_index의 차이, 다중 키 정렬, na_position을 활용한 결측치 위치 제어, kind 옵션을 통한 정렬 알고리즘 선택까지 모두 실무에서 반드시 알아두어야 할 포인트입니다.
라벨 기반 정렬과 값 기반 정렬을 구분해 쓰면 복잡한 데이터셋에서도 원하는 순서를 정확히 구현할 수 있고, 안정 정렬 옵션을 적절히 활용하면 동률 값에서도 의도한 순서를 유지할 수 있습니다.

특히 다중 키 정렬은 보고서 작성이나 그룹별 분석 시 필수적이며, 결측치의 위치를 명확히 지정해두면 분석 단계에서 혼란을 줄일 수 있습니다.
또한 멀티인덱스 정렬 기능은 계층적 데이터를 다룰 때 강력한 도구가 됩니다.
정리하자면, pandas의 정렬 기능을 정확히 이해하고 옵션을 적재적소에 활용하는 것이 데이터 분석 효율을 높이는 가장 확실한 방법입니다.


🏷️ 관련 태그 : pandas정렬, sort_values, sort_index, na_position, kind옵션, 데이터분석, 파이썬코딩, 멀티인덱스, 데이터전처리, 데이터사이언스