인덱스로 정렬하기
sort_index()로 인덱스 레이블에 따라 행 순서를 바꾸고 정렬된 인덱스가 성능을 향상하는 경우를 이해합니다.
인덱스로 정렬하기은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
DataFrame 인덱스 이해하기
모든 Pandas DataFrame에는 행을 식별하고 접근하는 데 사용하는 레이블 집합인 행 인덱스가 있습니다. 기본값은 RangeIndex(0, 1, 2, …)이지만 set_index()를 사용해 임의의 열(날짜, 이름, ID)로 설정할 수 있습니다. 인덱스가 의미 있는 경우(예: DatetimeIndex 또는 고객 ID) 열 값을 기준으로 정렬하는 것보다 인덱스를 기준으로 정렬하는 편이 논리적으로 정돈된 결과를 만듭니다.
import pandas as pd
df = pd.DataFrame(
{'value': [10, 20, 30]},
index=['C', 'A', 'B'] # out-of-order alphabetic index
)
print(df)
# value
# C 10
# A 20
# B 30sort_index() — 오름차순
DataFrame.sort_index()는 열 값이 아니라 인덱스 레이블을 기준으로 행의 순서를 바꿉니다. 기본 정렬은 오름차순입니다. 문자열 인덱스는 알파벳순으로, 정수 인덱스는 숫자순으로, DatetimeIndex는 시간순으로 정렬됩니다. 이는 섞였거나 순서에 맞지 않게 추가된 레코드가 있는 데이터세트를 자연스러운 순서로 되돌리는 표준 방법입니다.
import pandas as pd
df = pd.DataFrame(
{'temp': [22.5, 19.0, 25.1, 18.3]},
index=pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10', '2024-01-01'])
)
sorted_df = df.sort_index()
print(sorted_df)
# temp
# 2024-01-01 18.3
# 2024-01-15 19.0
# 2024-03-01 22.5
# 2024-06-10 25.1sort_index() 내림차순
ascending=False를 전달하면 인덱스를 가장 큰 값(또는 가장 최근 값)에서 가장 작은 값(또는 가장 이른 값) 순서로 정렬합니다. DatetimeIndex에서는 가장 최근 관측값이 위에 오므로 금융 데이터, 로그 파일, 이벤트 스트림처럼 최신 이벤트가 가장 중요한 경우에 일반적으로 사용하는 배치입니다.
import pandas as pd
df = pd.DataFrame(
{'price': [100, 110, 105, 115]},
index=pd.to_datetime(['2024-01', '2024-02', '2024-03', '2024-04'])
)
# Most recent first
print(df.sort_index(ascending=False))
# price
# 2024-04-30 115
# 2024-03-31 105
# 2024-02-29 110
# 2024-01-31 100axis=1로 열 레이블 정렬하기
기본적으로 sort_index()는 행 인덱스(axis=0)를 정렬합니다. axis=1을 전달하면 대신 열 레이블을 알파벳순으로 정렬합니다. 이는 열이 많은 넓은 DataFrames를 표준화하여 열이 예측 가능한 알파벳순으로 나타나게 할 때 유용합니다. 따라서 특정 열을 시각적으로 찾거나 DataFrames를 비교하기가 쉬워집니다.
import pandas as pd
df = pd.DataFrame({
'zebra': [1], 'apple': [2], 'mango': [3], 'banana': [4]
})
print('Before:', df.columns.tolist())
# ['zebra', 'apple', 'mango', 'banana']
sorted_cols = df.sort_index(axis=1)
print('After:', sorted_cols.columns.tolist())
# ['apple', 'banana', 'mango', 'zebra']정렬된 인덱스가 더 빠른 경우
인덱스가 정렬된 상태(단조 증가 또는 감소)이면 Pandas는 레이블 조회에 이진 검색을 사용할 수 있습니다. 정렬된 인덱스에서는 .loc['2024-01':'2024-06'] 슬라이스가 O(n)이 아니라 O(log n)이 됩니다. is_monotonic_increasing(또는 is_monotonic_decreasing) 메서드는 인덱스가 이미 정렬되어 있는지를 나타내는 불리언을 반환합니다. 큰 인덱스를 반복해서 슬라이스해야 한다면 먼저 정렬하는 일회성 비용을 감수할 가치가 있습니다.
import pandas as pd
import numpy as np
idx = pd.to_datetime(['2024-03-01', '2024-01-15', '2024-06-10'])
df = pd.DataFrame({'v': [1, 2, 3]}, index=idx)
print('Sorted?', df.index.is_monotonic_increasing) # False
df = df.sort_index()
print('Sorted?', df.index.is_monotonic_increasing) # True
# Now slicing is efficient
print(df.loc['2024-01':'2024-03'])MultiIndex와 함께 sort_index() 사용하기
DataFrame에 MultiIndex(계층형 행 인덱스)가 있으면 sort_index()는 기본적으로 계층의 모든 수준을 정렬합니다. level 매개변수를 사용하면 특정 수준으로 정렬 범위를 제한할 수 있습니다. .loc[(outer, inner), :]를 사용해 계층형 슬라이스를 효율적으로 수행하려면 정렬된 MultiIndex가 필요합니다.
import pandas as pd
arrays = [
['B', 'B', 'A', 'A'],
['two', 'one', 'two', 'one']
]
idx = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=idx)
print(df.sort_index())
# value
# first second
# A one 40
# two 30
# B one 20
# two 10MultiIndex의 한 수준만 정렬하기
MultiIndex를 사용할 때 다른 수준의 순서는 그대로 유지하면서 내부 수준이나 외부 수준 하나만 정렬하고 싶을 수 있습니다. sort_index()에 level=을 전달하세요. 정수(수준 위치), 문자열(수준 이름) 또는 목록을 지정할 수 있습니다. 외부 수준의 순서는 이미 올바르고 각 그룹 내부만 정렬하면 될 때 유용합니다.
import pandas as pd
df = pd.DataFrame({
'sales': [300, 100, 200, 400, 150, 250]
}, index=pd.MultiIndex.from_tuples([
('Eng', 'Dave'), ('Eng', 'Alice'), ('Eng', 'Bob'),
('HR', 'Zoe'), ('HR', 'Carol'), ('HR', 'Eve')
], names=['dept', 'name']))
# Sort only the 'name' level alphabetically within each dept
print(df.sort_index(level='name'))
# sales
# dept name
# Eng Alice 100
# Bob 200
# Dave 300
# HR Carol 150
# Eve 250
# Zoe 400sort_index()와 sort_values()의 차이
두 정렬 방법을 구분하는 것이 중요합니다. sort_values(by='col')은 열의 데이터 값을 기준으로 행의 순서를 바꿉니다. sort_index()는 어떤 열과 일치할 수도 있고 아닐 수도 있는 행 레이블(인덱스)을 기준으로 행의 순서를 바꿉니다. 인덱스가 기본 식별자(예: DatetimeIndex 또는 의미 있는 문자열 키)라면 sort_index()를 사용하는 것이 올바른 선택입니다.
import pandas as pd
df = pd.DataFrame(
{'value': [30, 10, 20]},
index=['C', 'A', 'B']
)
# sort_index: sorted by row label A, B, C
print(df.sort_index())
# value
# A 10
# B 20
# C 30
# sort_values: sorted by data value 10, 20, 30
print(df.sort_values('value'))
# value
# A 10
# B 20
# C 30
# (same here because values happen to match alphabetical label order!)작업 후 원래 순서 복원하기
일부 작업(섞기, df.sample(frac=1)을 사용한 무작위 샘플링)은 행의 순서를 뒤섞습니다. sort_index()는 원래의 순차적 순서를 복원하는 깔끔한 방법입니다. 원래 순서가 RangeIndex(0, 1, 2, …)였다면 sort_index()가 이를 복원하고, 의미 있는 레이블이었다면 해당 레이블의 자연스러운 순서를 복원합니다.
import pandas as pd
df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
# Shuffle (random sample)
shuffled = df.sample(frac=1, random_state=42)
print('Shuffled index:', shuffled.index.tolist())
# e.g. [2, 4, 0, 1, 3]
# Restore original order by sorting the index
restored = shuffled.sort_index()
print('Restored index:', restored.index.tolist())
# [0, 1, 2, 3, 4]na_position을 사용하는 sort_index()
sort_values()와 마찬가지로 sort_index()도 NaN 인덱스 레이블이 나타날 위치를 제어하는 na_position을 지원합니다. 이는 일부 NaN 레이블이 포함된 문자열 또는 날짜 인덱스를 DataFrame이 가지고 있을 때 중요합니다(인덱스 값 누락을 발생시키는 작업 후에 생길 수 있습니다). 기본값은 'last'입니다.
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'v': [1, 2, 3, 4]},
index=['B', None, 'A', 'C']
)
print(df.sort_index(na_position='last'))
# v
# A 3
# B 1
# C 4
# NaN 2성능 향상 측정
Python의 timeit을 사용하여 정렬되지 않은 DatetimeIndex와 정렬된 DatetimeIndex에서 슬라이스를 비교하면, 정렬된 인덱스의 성능 이점을 실험적으로 측정할 수 있습니다. 정렬된 경우에는 이진 검색을 사용하므로 큰 DataFrame에서 일반적으로 5~20배 더 빠릅니다. 이는 sort_index()가 단순히 보기 좋게 만드는 작업이 아니라 실제 실행 시간에 영향을 미친다는 점을 보여 줍니다.
import pandas as pd
import numpy as np
np.random.seed(0)
random_dates = pd.to_datetime(
pd.Timestamp('2020-01-01').value + np.random.randint(0, 1_000_000_000_000_000, size=100_000),
unit='ns'
)
df = pd.DataFrame({'val': np.random.randn(100_000)}, index=random_dates)
# Without sort: O(n) scan
import timeit
t1 = timeit.timeit(lambda: df.loc['2022-01':'2022-06'], number=100)
df_sorted = df.sort_index()
t2 = timeit.timeit(lambda: df_sorted.loc['2022-01':'2022-06'], number=100)
print(f'Unsorted: {t1:.3f}s, Sorted: {t2:.3f}s, Speedup: {t1/t2:.1f}x')빠른 확인
Pandas에서 인덱스로 정렬하는 방법을 얼마나 이해했는지 확인해 보세요.
레슨 요약
이 레슨에서는 다음을 배웠습니다. sort_index()는 열의 값이 아니라 레이블을 기준으로 행의 순서를 바꾸고, axis=1은 열 레이블을 알파벳순으로 정렬하며, 정렬된 인덱스는 이진 검색을 가능하게 하여 시간 기반 슬라이싱을 훨씬 빠르게 만듭니다. MultiIndex DataFrame에서는 level=을 사용하여 하나의 계층 수준으로 정렬 범위를 제한할 수 있습니다. 효율적인 슬라이스 조회에 의존하기 전에 항상 is_monotonic_increasing을 확인하세요. 다음에는 열 내에서 값의 순위를 매겨 보겠습니다.
자주 묻는 질문
“인덱스로 정렬하기” 강의는 무료인가요?
네 — “인덱스로 정렬하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“인덱스로 정렬하기”에서 뭘 배우나요?
sort_index()로 인덱스 레이블에 따라 행 순서를 바꾸고 정렬된 인덱스가 성능을 향상하는 경우를 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“인덱스로 정렬하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 열 값으로 정렬하기
- 인덱스로 정렬하기
- 값 순위 매기기
- 인덱스 설정과 재설정