MultiIndex 만들기
pd.MultiIndex.from_tuples 또는 여러 열에 대한 set_index로 계층형 행 인덱스를 만들고 그 수준을 확인합니다.
MultiIndex 만들기은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
MultiIndex란 무엇인가요
MultiIndex(계층적 인덱스라고도 함)를 사용하면 Pandas DataFrame 또는 Series에 여러 수준의 행 레이블을 지정할 수 있습니다. 데이터베이스의 복합 키와 같다고 생각하면 됩니다. 단일 레이블로 행을 식별하는 대신 (국가, 도시) 또는 (연도, 분기)와 같은 튜플로 식별하는 방식입니다. MultiIndexes는 패널 데이터, 횡단면 시계열, 그리고 자연스럽게 2단계 그룹 구조를 이루는 모든 데이터셋을 표현하는 데 필수적입니다.
import pandas as pd
# A simple example: sales by country and city
data = {
'sales': [100, 200, 150, 300, 80, 120]
}
index = pd.MultiIndex.from_tuples(
[('USA', 'New York'), ('USA', 'Chicago'),
('UK', 'London'), ('UK', 'Manchester'),
('DE', 'Berlin'), ('DE', 'Munich')],
names=['country', 'city']
)
df = pd.DataFrame(data, index=index)
print(df)from_tuples로 MultiIndex 생성
pd.MultiIndex.from_tuples(list_of_tuples, names=)는 MultiIndex를 생성하는 가장 명시적인 방법입니다. 각 튜플이 하나의 행 레이블이 되고, 튜플의 요소가 각 수준이 됩니다. names 매개변수는 각 수준에 레이블을 할당합니다(예: ['year', 'quarter']). 복합 키로 사용할 미리 만든 목록이 있을 때 유용한 방법입니다.
import pandas as pd
# Multi-level time index: year x quarter
tuples = [
(2022, 'Q1'), (2022, 'Q2'), (2022, 'Q3'), (2022, 'Q4'),
(2023, 'Q1'), (2023, 'Q2'), (2023, 'Q3'), (2023, 'Q4')
]
mi = pd.MultiIndex.from_tuples(tuples, names=['year', 'quarter'])
revenue = [120, 135, 145, 160, 130, 148, 162, 175]
df = pd.Series(revenue, index=mi, name='revenue_M')
print(df)from_product로 MultiIndex 생성
pd.MultiIndex.from_product(iterables, names=)는 여러 목록의 카테시안 곱, 즉 입력 목록에 있는 요소들의 모든 조합으로 MultiIndex를 생성합니다. 데이터에 모든 수준 조합이 존재해야 할 때 가장 편리한 방법입니다. 예를 들어 3개 연도 × 4개 분기 × 5개 지역의 모든 조합을 사용하면 균형 패널 60행이 자동으로 생성됩니다.
import pandas as pd
import numpy as np
years = [2021, 2022, 2023]
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
# Cartesian product: 3 years x 4 quarters = 12 combinations
mi = pd.MultiIndex.from_product([years, quarters], names=['year', 'quarter'])
print('Number of index entries:', len(mi))
print('First 6 entries:', mi[:6].tolist())
# Create a DataFrame with this index
df = pd.DataFrame({'revenue': np.random.randint(100, 200, 12)}, index=mi)
print('\n', df.head())set_index로 MultiIndex 생성
실무에서 MultiIndex를 생성하는 가장 일반적인 방법은 그룹화 열이 있는 일반 DataFrame으로 시작한 다음 df.set_index([col1, col2])를 호출하는 것입니다. 이렇게 하면 해당 열이 데이터 열에서 인덱스 수준으로 승격됩니다. 결과는 처음부터 from_tuples로 인덱스를 만든 경우와 같지만, 표 형식 데이터에서 시작해 한 줄만 작성하면 됩니다.
import pandas as pd
# Start with a flat DataFrame
df_flat = pd.DataFrame({
'country': ['USA', 'USA', 'UK', 'UK', 'DE', 'DE'],
'year': [2022, 2023, 2022, 2023, 2022, 2023],
'gdp_bn': [25000, 26000, 3100, 3200, 4200, 4350]
})
# Promote two columns to a MultiIndex
df = df_flat.set_index(['country', 'year'])
print(df)
print('\nIndex type:', type(df.index).__name__)
print('Index names:', df.index.names)MultiIndex 수준 확인
MultiIndex는 수준(각 수준의 고유 값)과 코드(수준 배열을 가리키는 정수 포인터)에 데이터를 저장합니다. df.index.levels 또는 df.index.get_level_values(level)로 수준을 확인하세요. df.index.nlevels를 사용하면 수준의 개수를 확인할 수 있습니다. names 속성에는 각 수준에 할당된 이름이 나열됩니다. df.index.set_names(['level0', 'level1'])로 이름을 설정하세요.
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA', 'USA', 'UK', 'UK'],
'year': [2022, 2023, 2022, 2023],
'gdp': [25000, 26000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year'])
print('Number of levels:', df.index.nlevels)
print('Level names:', df.index.names)
print('Level 0 values:', df.index.get_level_values(0).tolist())
print('Level 1 values:', df.index.get_level_values(1).tolist())
print('Unique level 0:', df.index.get_level_values('country').unique().tolist())열에 적용하는 MultiIndex
MultiIndex는 열에도 적용하여 열 레이블의 계층 구조를 만들 수 있습니다. 피벗 스타일 레이아웃에서 각 범주에 대해 여러 지표를 저장할 때 흔히 사용합니다. 예를 들어 (수익, Q1), (수익, Q2), (비용, Q1), (비용, Q2)와 같은 형태입니다. 행에 접근할 때와 같은 방식으로 튜플을 사용해 MultiIndex가 적용된 열에 접근하세요. pd.MultiIndex.from_product로 열 MultiIndex를 생성하고 df.columns에 할당할 수 있습니다.
import pandas as pd
import numpy as np
# Create a DataFrame with MultiIndex columns
metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
col_index = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
data = np.random.randint(50, 200, size=(3, 8))
df = pd.DataFrame(data, columns=col_index, index=['USA', 'UK', 'DE'])
df.index.name = 'country'
print(df)GroupBy 집계 후의 MultiIndex
groupby([col1, col2]).agg(...)를 호출하면 결과 DataFrame의 행에 MultiIndex가 생성됩니다(두 groupby 키가 두 인덱스 수준이 됨). 여러 지표를 집계하는 경우에는 열에도 MultiIndex가 생성될 수 있습니다. 일상적인 데이터 분석에서 MultiIndex를 접하게 되는 가장 일반적인 방식이므로, groupby 결과를 다룰 때 이를 탐색하는 방법을 이해하는 것이 필수적입니다.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
# Two-key groupby creates a MultiIndex on rows
result = tips.groupby(['day', 'time'])['total_bill'].agg(['mean', 'count'])
print(result)
print('\nIndex type:', type(result.index).__name__)
print('Index names:', result.index.names)수준 교환 및 순서 변경
df.swaplevel()을 사용하면 두 인덱스 수준을 교환할 수 있고, df.reorder_levels([...])을 사용하면 모든 수준의 순서를 변경할 수 있습니다. 내부 수준을 먼저 기준으로 슬라이싱하거나, 두 DataFrame의 인덱스 수준 순서가 달라 병합 전에 맞춰야 할 때 순서를 변경하면 유용합니다. 순서를 변경한 후에는 효율적인 슬라이싱을 위해 항상 sort_index()를 호출하여 사전식 순서를 복원하세요.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('Original levels:', result.index.names)
# Swap so time is the outer level
swapped = result.swaplevel().sort_index()
print('\nSwapped levels:', swapped.index.names)
print(swapped.head())MultiIndex 확인 및 정렬
MultiIndex를 슬라이싱하는 작업은 인덱스가 사전식으로 정렬되어 있을 때만 효율적입니다. df.index.is_monotonic_increasing으로 인덱스가 정렬되어 있는지 확인하세요. False를 반환하면 df.sort_index()로 정렬합니다. 정렬되지 않은 MultiIndex는 슬라이스 작업에서 PerformanceWarning을 발생시키고 일부 예외적인 경우 잘못된 결과를 반환할 수 있으므로, MultiIndex를 생성하거나 수정한 후에는 항상 정렬하세요.
import pandas as pd
# Create an unsorted MultiIndex deliberately
tuples = [('B', 2), ('A', 1), ('B', 1), ('A', 2)]
mi = pd.MultiIndex.from_tuples(tuples, names=['letter', 'num'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=mi)
print('Is sorted:', df.index.is_monotonic_increasing)
print('Before sorting:')
print(df)
df_sorted = df.sort_index()
print('\nAfter sorting:')
print(df_sorted)
print('Is sorted:', df_sorted.index.is_monotonic_increasing)MultiIndex를 열로 재설정
df.reset_index()를 호출하면 모든 인덱스 수준이 일반 열로 다시 변환되고, DataFrame에는 일반 정수 RangeIndex가 남습니다. 이는 groupby 집계 후에 자주 사용하는 패턴입니다. 먼저 MultiIndex로 그룹화된 요약을 계산한 다음 인덱스를 재설정하여, 이후의 Pandas 작업이나 병합 또는 CSV 내보내기에 적합한 평면 DataFrame을 얻습니다. 2단계 인덱스 중 한 수준만 재설정하려면 reset_index(level='name')을 사용합니다.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('MultiIndex result:')
print(result.head(4))
# Flatten back to a regular DataFrame
flat = result.reset_index()
print('\nFlattened DataFrame:')
print(flat.head(4))
print('Index type:', type(flat.index).__name__)MultiIndex를 사용할 때
데이터에 자연스러운 계층 구조가 있을 때 MultiIndex를 사용합니다. 예를 들면 하루보다 작은 단위의 세분성을 가진 시계열(날짜 + 시간), 패널 데이터(엔터티 + 기간), 중첩된 그룹화(국가 + 지역 + 도시) 등이 있습니다. 두 개의 열로 된 단순한 그룹 키에서는 별도의 열을 사용하는 평면 DataFrame이 똑같이 읽기 쉽다면 MultiIndex를 피하는 것이 좋습니다. 데이터에 접근하기 위해 계속 reset_index()를 호출하고 있다면, 작업 흐름에서 MultiIndex가 별다른 이점을 주지 않는다는 신호입니다.
빠른 확인
이 강의에서 배운 MultiIndex 생성에 대한 이해도를 확인해 보세요.
강의 요약
이 강의에서는 튜플을 사용하여 계층적인 행(또는 열) 레이블을 제공하는 MultiIndex를 배웠습니다. MultiIndex는 여러 열에 from_tuples, from_product 또는 set_index를 사용하여 만들며, 효율적인 슬라이싱을 위해 항상 정렬해야 합니다. 다음에는 .loc, 튜플, 슬라이스 및 IndexSlice 도우미를 사용하여 MultiIndex에서 데이터를 선택하는 방법을 살펴봅니다.
AI 튜터와 함께 Python을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 30
- 레슨
- 120
자주 묻는 질문
“MultiIndex 만들기” 강의는 무료인가요?
네 — “MultiIndex 만들기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“MultiIndex 만들기”에서 뭘 배우나요?
pd.MultiIndex.from_tuples 또는 여러 열에 대한 set_index로 계층형 행 인덱스를 만들고 그 수준을 확인합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“MultiIndex 만들기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- MultiIndex 만들기
- MultiIndex에서 데이터 선택하기
- 인덱스 정렬과 재인덱싱
- 정렬된 인덱스의 성능 이점