0Pricing
Pandas & NumPy Academy · 강의

인덱스 설정과 재설정

set_index()로 열을 행 인덱스로 올리고 reset_index()로 되돌리며 MultiIndex의 개요를 살펴봅니다.

인덱스 설정과 재설정은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

DataFrame 인덱스란 무엇인가요?

모든 Pandas DataFrame에는 각 행에 연결된 레이블 집합인 행 인덱스가 있습니다. 기본 인덱스는 RangeIndex(0, 1, 2, …)이지만, 날짜, 제품 ID, 사용자 ID 또는 고유 키처럼 자연스러운 식별자 역할을 하는 어떤 열로든 바꿀 수 있습니다. 의미 있는 인덱스를 사용하면 가독성이 향상되고, 레이블 기반 슬라이싱이 가능해지며, 시계열 리샘플링에 필요합니다.

import pandas as pd

df = pd.DataFrame({
    'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
    'sales': [100, 200, 150]
})
print('Default index:', df.index.tolist())  # [0, 1, 2]
print(df)

set_index() — 열 승격하기

DataFrame.set_index('col')은 지정한 열을 행 인덱스로 승격하고 일반 열에서는 제거합니다. 해당 열의 값이 행 레이블이 됩니다. 한 열이 자연스러운 키 역할을 할 때 DataFrame을 더 의미 있게 만드는 표준적인 방법입니다. 새 DataFrame이 반환되며, inplace=True를 사용하지 않는 한 원본은 변경되지 않습니다.

import pandas as pd

df = pd.DataFrame({
    'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
    'sales': [100, 200, 150]
})

df = df.set_index('date')
print(df)
#             sales
# date
# 2024-01-01    100
# 2024-01-02    200
# 2024-01-03    150

print(df.index)  # Index(['2024-01-01', ...], dtype='object', name='date')

사용자 지정 인덱스로 행 선택하기

의미 있는 열을 인덱스로 설정하면 .loc[label]을 사용하여 불리언 마스크 없이도 깔끔하고 읽기 쉬운 문법으로 레이블에 해당하는 행을 가져올 수 있습니다. DatetimeIndex에서는 df.loc['2024-01']과 같은 일부 날짜 문자열도 사용하여 2024년 1월의 모든 행을 선택할 수 있습니다.

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C'],
    'price': [10, 20, 30],
    'stock': [100, 50, 75]
})
df = df.set_index('product')

# Access row by label
print(df.loc['B'])
# price    20
# stock    50
# Name: B, dtype: int64

여러 열을 사용하는 set_index() — MultiIndex

열 이름의 목록을 set_index()에 전달하면 MultiIndex(계층형 인덱스)가 생성됩니다. 결과 DataFrame은 .loc[]에서 튜플을 사용하여 조회할 수 있습니다. MultiIndex는 그룹화된 시계열(지역 + 날짜), 패널 데이터(대상 + 시간), 두 수준의 행 그룹화가 필요한 모든 분석에 필수적입니다.

import pandas as pd

df = pd.DataFrame({
    'region': ['East', 'East', 'West', 'West'],
    'year': [2023, 2024, 2023, 2024],
    'revenue': [100, 150, 200, 220]
})

df = df.set_index(['region', 'year'])
print(df)
#              revenue
# region year
# East   2023      100
#        2024      150
# West   2023      200
#        2024      220

print(df.loc[('East', 2024)])  # revenue = 150

set_index()의 drop= 매개변수

기본적으로 set_index('col')은 해당 열을 인덱스로 설정한 뒤 DataFrame의 일반 열에서 제거합니다. drop=False를 전달하면 해당 열을 인덱스로 사용하면서도 열을 그대로 유지할 수 있습니다. 레이블 기반 접근도 필요하고 일반 열 영역에서 계산하기 위해 해당 열도 사용해야 할 때 유용합니다.

import pandas as pd

df = pd.DataFrame({'id': [1, 2, 3], 'value': [10, 20, 30]})

# Keep 'id' as both index and column
df_with_both = df.set_index('id', drop=False)
print(df_with_both)
#     id  value
# id
# 1    1     10
# 2    2     20
# 3    3     30

reset_index() — 인덱스를 열로 되돌리기

reset_index()는 set_index()의 반대 작업입니다. 현재 행 인덱스를 일반 열로 옮기고 인덱스를 기본 RangeIndex로 바꿉니다. 이는 groupby().agg() 후 또는 이후 처리에서 열로 사용해야 하는 의미 있는 인덱스가 남는 작업 후에 흔히 필요합니다.

import pandas as pd

df = pd.DataFrame({'sales': [100, 200]}, index=['East', 'West'])
df.index.name = 'region'

reset = df.reset_index()
print(reset)
#   region  sales
# 0   East    100
# 1   West    200

print(reset.index.tolist())  # [0, 1] — default RangeIndex restored

reset_index(drop=True)

reset_index()에 drop=True를 전달하면 현재 인덱스를 열로 옮기지 않고 완전히 삭제합니다. 현재 인덱스에 의미 있는 정보가 없을 때(예: 행을 필터링한 후 인덱스에 0, 3, 7처럼 빈칸이 있을 때) 사용하면 0부터 시작하는 깔끔한 순차 인덱스를 만들 수 있습니다.

import pandas as pd

df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
filtered = df[df['x'] > 15]
print('Filtered index:', filtered.index.tolist())  # [1, 2, 3, 4]

# Drop the old index — don't move it to a column
clean = filtered.reset_index(drop=True)
print('Clean index:', clean.index.tolist())  # [0, 1, 2, 3]

groupby 후 reset_index()

groupby().agg()를 호출하면 그룹화 키가 인덱스가 됩니다. reset_index()를 호출하면 이를 일반 열로 되돌려 작업, 병합 또는 내보내기가 더 쉬운 평면 표 형식의 결과를 얻을 수 있습니다. 이는 실제로 reset_index()를 사용하는 가장 일반적인 방법 중 하나입니다.

import pandas as pd

df = pd.DataFrame({
    'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR'],
    'salary': [90000, 50000, 80000, 70000, 55000]
})

# After groupby, dept becomes the index
agg = df.groupby('dept')['salary'].mean()
print(type(agg), agg.index.tolist())
# dept is the index

# Reset makes dept a regular column again
result = agg.reset_index()
result.columns = ['dept', 'avg_salary']
print(result)

인덱스 이름을 위한 rename_axis()

행 인덱스에 이름이 없거나 명확하게 표시하기 위해 이름을 바꾸려면 df.rename_axis('new_name')(행 인덱스) 또는 df.rename_axis('col_name', axis=1)(열 축)를 사용하세요. 인덱스에 의미 있는 이름을 지정하면 특히 인덱스 이름이 열 머리글이 되는 CSV로 내보낼 때 결과를 별도의 설명 없이도 이해하기 쉬워집니다.

import pandas as pd

df = pd.DataFrame({'sales': [100, 200, 300]}, index=['A', 'B', 'C'])
print(df.index.name)  # None

# Name the index
df = df.rename_axis('region')
print(df)
#         sales
# region
# A         100
# B         200
# C         300

빈칸을 채우기 위한 재인덱싱

DataFrame.reindex(new_index)는 DataFrame을 새 인덱스에 맞게 재구성하고, 새 인덱스에는 있지만 원래 데이터에는 없는 위치를 NaN으로 채웁니다. 이는 DataFrame을 공통의 완전한 인덱스에 맞추는 데 사용됩니다. 예를 들어 일부 달에 데이터가 없어도 한 해의 모든 달이 표시되도록 할 수 있습니다.

import pandas as pd

df = pd.DataFrame({
    'month': ['Jan', 'Mar', 'Jun'],
    'revenue': [100, 200, 300]
}).set_index('month')

all_months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
complete = df.reindex(all_months)
print(complete)
#       revenue
# Jan     100.0
# Feb       NaN   <- filled with NaN
# Mar     200.0
# Apr       NaN
# May       NaN
# Jun     300.0

MultiIndex reset_index 및 수준 선택

MultiIndex DataFrame에서 reset_index()는 기본적으로 모든 수준을 열로 옮깁니다. 특정 수준만 재설정하려면 level=을 전달하세요. 이렇게 하면 한 수준은 인덱스로 유지하면서(예: 날짜를 인덱스로 유지) 다른 수준만 열로 옮길 수 있습니다.

import pandas as pd

df = pd.DataFrame(
    {'revenue': [100, 150, 200, 220]},
    index=pd.MultiIndex.from_tuples(
        [('East', 2023), ('East', 2024), ('West', 2023), ('West', 2024)],
        names=['region', 'year']
    )
)

# Reset only the 'year' level, keep 'region' as index
df2 = df.reset_index(level='year')
print(df2)
#         year  revenue
# region
# East    2023      100
# East    2024      150
# West    2023      200
# West    2024      220

빠른 확인

인덱스를 설정하고 재설정하는 방법을 얼마나 이해했는지 확인해 보세요.

레슨 요약

이 레슨에서는 다음을 배웠습니다. set_index('col')은 레이블 기반 접근을 위해 열을 행 인덱스로 승격하고, 목록을 전달하면 MultiIndex가 생성되며, reset_index()는 인덱스를 다시 열로 옮깁니다(drop=True를 사용하면 대신 인덱스를 삭제합니다). reindex()를 사용하면 누락된 위치를 NaN으로 채우면서 완전한 대상 인덱스에 맞출 수 있습니다. 이러한 기법은 이후에 배울 GroupBy 및 병합 레슨의 기초가 됩니다.

자주 묻는 질문

“인덱스 설정과 재설정” 강의는 무료인가요?

네 — “인덱스 설정과 재설정” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“인덱스 설정과 재설정”에서 뭘 배우나요?

set_index()로 열을 행 인덱스로 올리고 reset_index()로 되돌리며 MultiIndex의 개요를 살펴봅니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“인덱스 설정과 재설정” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 열 값으로 정렬하기
  2. 인덱스로 정렬하기
  3. 값 순위 매기기
  4. 인덱스 설정과 재설정
← Pandas & NumPy Academy(으)로 돌아가기