Skip to content

Pandas Sort Values: Python에서 DataFrame 정렬 완전 가이드

Updated on

정렬되지 않은 데이터는 분석하기 어렵습니다. 수천 행의 데이터를 스캔하며 최고 매출, 최근 날짜, 최저 오류율을 찾지만 -- 데이터가 정렬되어 있었다면 명확했을 패턴을 놓치게 됩니다. Python 리스트 정렬은 단순한 경우에는 작동하지만, DataFrame은 여러 열, 혼합 타입, 결측값을 가지고 있어 리스트로는 처리할 수 없습니다.

Pandas의 sort_values()는 오름차순/내림차순 순서, null 위치, 안정성을 완전히 제어하면서 하나 이상의 열로 모든 DataFrame을 정렬합니다. 이 가이드는 실제 데이터 작업에서 만나게 될 모든 정렬 패턴을 다룹니다.

📚

sort_values()를 사용한 기본 정렬

단일 열로 정렬

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
    'score': [85, 92, 78, 95, 88],
    'age': [25, 30, 22, 28, 35]
})
 
# score로 정렬 (기본값은 오름차순)
sorted_df = df.sort_values('score')
print(sorted_df)
#       name  score  age
# 2  Charlie     78   22
# 0    Alice     85   25
# 4      Eve     88   35
# 1      Bob     92   30
# 3    Diana     95   28

내림차순 정렬

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
    'score': [85, 92, 78, 95, 88],
    'age': [25, 30, 22, 28, 35]
})
 
# 최고 점수 우선
sorted_df = df.sort_values('score', ascending=False)
print(sorted_df)
#       name  score  age
# 3    Diana     95   28
# 1      Bob     92   30
# 4      Eve     88   35
# 0    Alice     85   25
# 2  Charlie     78   22

인플레이스 정렬

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'score': [85, 92, 78]
})
 
# df를 직접 수정 (복사본 생성 안 함)
df.sort_values('score', inplace=True)
print(df)
#       name  score
# 2  Charlie     78
# 0    Alice     85
# 1      Bob     92

다중 열 정렬

여러 열로 정렬

import pandas as pd
 
df = pd.DataFrame({
    'department': ['Sales', 'Engineering', 'Sales', 'Engineering', 'Sales'],
    'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
    'salary': [70000, 85000, 65000, 90000, 70000]
})
 
# 먼저 부서별로 정렬한 다음 각 부서 내에서 급여별로 정렬
sorted_df = df.sort_values(['department', 'salary'])
print(sorted_df)
#     department     name  salary
# 1  Engineering      Bob   85000
# 3  Engineering    Diana   90000
# 2        Sales  Charlie   65000
# 0        Sales    Alice   70000
# 4        Sales      Eve   70000

오름차순/내림차순 혼합

import pandas as pd
 
df = pd.DataFrame({
    'department': ['Sales', 'Engineering', 'Sales', 'Engineering', 'Sales'],
    'name': ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'],
    'salary': [70000, 85000, 65000, 90000, 70000]
})
 
# 부서는 오름차순, 급여는 내림차순
sorted_df = df.sort_values(
    ['department', 'salary'],
    ascending=[True, False]
)
print(sorted_df)
#     department     name  salary
# 3  Engineering    Diana   90000
# 1  Engineering      Bob   85000
# 0        Sales    Alice   70000
# 4        Sales      Eve   70000
# 2        Sales  Charlie   65000

결측값(NaN) 처리

기본적으로 정렬 방향에 관계없이 NaN 값은 끝에 배치됩니다. na_position으로 제어할 수 있습니다:

import pandas as pd
import numpy as np
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
    'score': [85, np.nan, 78, np.nan]
})
 
# NaN을 끝에 (기본값)
print(df.sort_values('score'))
#       name  score
# 2  Charlie   78.0
# 0    Alice   85.0
# 1      Bob    NaN
# 3    Diana    NaN
 
# NaN을 처음에
print(df.sort_values('score', na_position='first'))
#       name  score
# 1      Bob    NaN
# 3    Diana    NaN
# 2  Charlie   78.0
# 0    Alice   85.0

sort_index()로 인덱스별 정렬

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'score': [85, 92, 78]
}, index=[2, 0, 1])
 
# 인덱스로 정렬
print(df.sort_index())
#      name  score
# 0     Bob     92
# 1  Charlie    78
# 2   Alice     85
 
# 열 이름으로 정렬 (axis=1)
df2 = pd.DataFrame({
    'c': [1, 2], 'a': [3, 4], 'b': [5, 6]
})
print(df2.sort_index(axis=1))
#    a  b  c
# 0  3  5  1
# 1  4  6  2

정렬 후 인덱스 재설정

정렬 후 원래 인덱스가 유지됩니다. 깨끗한 순차 인덱스를 얻으려면:

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'score': [85, 92, 78]
})
 
sorted_df = df.sort_values('score').reset_index(drop=True)
print(sorted_df)
#       name  score
# 0  Charlie     78
# 1    Alice     85
# 2      Bob     92

drop=True를 사용하여 이전 인덱스를 버립니다. 이 옵션 없이는 이전 인덱스가 열이 됩니다.

사용자 정의 정렬 순서

범주형 타입 사용

import pandas as pd
 
df = pd.DataFrame({
    'priority': ['Medium', 'High', 'Low', 'High', 'Medium'],
    'task': ['Task A', 'Task B', 'Task C', 'Task D', 'Task E']
})
 
# 사용자 정의 순서 정의
priority_order = pd.CategoricalDtype(['Low', 'Medium', 'High'], ordered=True)
df['priority'] = df['priority'].astype(priority_order)
 
sorted_df = df.sort_values('priority')
print(sorted_df)
#   priority    task
# 2      Low  Task C
# 0   Medium  Task A
# 4   Medium  Task E
# 1     High  Task B
# 3     High  Task D

key 매개변수 사용

import pandas as pd
 
df = pd.DataFrame({
    'name': ['alice', 'Bob', 'CHARLIE', 'diana'],
    'score': [85, 92, 78, 95]
})
 
# 대소문자 구분 없는 정렬
sorted_df = df.sort_values('name', key=lambda x: x.str.lower())
print(sorted_df)
#       name  score
# 0    alice     85
# 1      Bob     92
# 2  CHARLIE     78
# 3    diana     95

메서드 비교

메서드용도원본 수정?반환값
sort_values(col)열 값으로 정렬아니오 (inplace=True 제외)정렬된 DataFrame
sort_values([col1, col2])여러 열로 정렬아니오 (inplace=True 제외)정렬된 DataFrame
sort_index()행 인덱스로 정렬아니오 (inplace=True 제외)정렬된 DataFrame
nsmallest(n, col)최소 n개 값 가져오기아니오DataFrame 서브셋
nlargest(n, col)최대 n개 값 가져오기아니오DataFrame 서브셋
rank()값에 순위 할당아니오순위 Series

성능 팁

Top-N에 nlargest()와 nsmallest() 사용

상위 또는 하위 N개의 행만 필요할 때, nlargest()nsmallest()는 전체 DataFrame을 정렬하는 것보다 빠릅니다:

import pandas as pd
import numpy as np
 
# 대용량 DataFrame
df = pd.DataFrame({
    'id': range(1_000_000),
    'value': np.random.randn(1_000_000)
})
 
# 더 빠름: 상위 10개만 찾기
top_10 = df.nlargest(10, 'value')
 
# 더 느림: 모두 정렬한 후 슬라이싱
top_10_slow = df.sort_values('value', ascending=False).head(10)

안정 정렬 vs 불안정 정렬

import pandas as pd
 
df = pd.DataFrame({
    'group': ['A', 'B', 'A', 'B'],
    'value': [1, 1, 2, 2],
    'order': [1, 2, 3, 4]
})
 
# 안정 정렬 (기본값)은 동일 값의 원래 순서를 유지
stable = df.sort_values('value', kind='mergesort')  # 기본값
 
# 불안정 정렬 (대용량 데이터셋에서 더 빠름)
unstable = df.sort_values('value', kind='quicksort')

실용적인 예제

날짜 정렬

import pandas as pd
 
df = pd.DataFrame({
    'event': ['Launch', 'Meeting', 'Deadline', 'Review'],
    'date': pd.to_datetime(['2026-03-15', '2026-01-10', '2026-02-28', '2026-01-05'])
})
 
# 시간순 정렬
print(df.sort_values('date'))
#      event       date
# 3   Review 2026-01-05
# 1  Meeting 2026-01-10
# 2 Deadline 2026-02-28
# 0   Launch 2026-03-15

GroupBy와 함께 정렬

import pandas as pd
 
df = pd.DataFrame({
    'store': ['A', 'A', 'B', 'B', 'A', 'B'],
    'product': ['X', 'Y', 'X', 'Y', 'Z', 'Z'],
    'revenue': [100, 250, 150, 300, 200, 175]
})
 
# 각 매장에서 매출이 가장 높은 제품
top_per_store = (df.sort_values('revenue', ascending=False)
                   .groupby('store')
                   .head(1))
print(top_per_store)
#   store product  revenue
# 3     B       Y      300
# 1     A       Y      250

정렬된 데이터 시각적 탐색

DataFrame을 정렬하여 패턴을 찾은 후, PyGWalker (opens in a new tab)를 사용하면 Jupyter에서 인터랙티브한 드래그 앤 드롭 차트로 동일한 데이터를 탐색할 수 있습니다 -- 추가 코드 불필요:

import pygwalker as pyg
 
walker = pyg.walk(sorted_df)

자주 묻는 질문

pandas에서 열로 DataFrame을 정렬하려면?

df.sort_values('column_name')으로 오름차순, df.sort_values('column_name', ascending=False)로 내림차순 정렬합니다. 여러 열의 경우 리스트를 전달합니다: df.sort_values(['col1', 'col2']).

여러 열을 서로 다른 순서로 정렬하려면?

ascending에 불리언 리스트를 전달합니다: df.sort_values(['col1', 'col2'], ascending=[True, False]). 이렇게 하면 col1은 오름차순, col2는 내림차순으로 정렬됩니다.

정렬 시 NaN 값은 어디에 배치되나요?

기본적으로 정렬 방향에 관계없이 NaN 값은 끝에 배치됩니다. na_position='first'를 사용하여 처음에 배치할 수 있습니다: df.sort_values('col', na_position='first').

sort_values와 sort_index의 차이점은?

sort_values()는 열 값으로 정렬합니다. sort_index()는 행 인덱스(또는 axis=1로 열 인덱스)로 정렬합니다. 데이터 정렬에는 sort_values를, 인덱스 라벨 순서에는 sort_index를 사용합니다.

복사본을 만들지 않고 DataFrame을 인플레이스로 정렬하려면?

inplace=True를 전달합니다: df.sort_values('col', inplace=True). 이는 원본 DataFrame을 수정하고 None을 반환합니다. 하지만 현대적인 pandas 스타일에서는 재할당이 권장됩니다: df = df.sort_values('col').

결론

sort_values()는 pandas에서 DataFrame을 정렬하기 위한 주요 도구입니다. 단순 정렬에는 단일 열 이름을, 다중 열 정렬에는 리스트를, 방향 제어에는 ascending 매개변수를 사용하세요. na_position으로 결측값을 처리하고, Top-N 쿼리에는 nlargest()/nsmallest()를, 사용자 정의 정렬에는 CategoricalDtype를 사용하세요. 정렬은 기본적으로 새 DataFrame을 반환한다는 것을 기억하세요 -- 깨끗한 순차 인덱스가 필요하면 reset_index(drop=True)를 사용하세요.

📚