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.0sort_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 92drop=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 Dkey 매개변수 사용
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-15GroupBy와 함께 정렬
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)를 사용하세요.