본문 바로가기
목차
Python/pandas

[Pandas] index 와 columns- 관련 메서드: rename(), set_index(), reset_index()

by ds31x 2025. 8. 24.
728x90
반응형

https://bookdata.readthedocs.io/en/latest/base/01_pandas.html

DataFrame과 Series의 index, DataFrame의 columns

Series.index, DataFrame.index, DataFrame.columns
모두 pandas.Index 객체로, 각각 row labels 또는 column labels의 집합을 나타냄.

  • 이들은 immutable하여 개별 원소 수정은 불가능하지만,
  • 새로운 Index 객체로 전체 교체가 가능하며,
  • 집합 연산(union, intersection 등)등을 지원함.

1. Series객체의 index 속성

  • 정의: Series의 row labels 를 담는 객체
  • 자료형: pandas.Index
  • 특징:
    • immutable 성질을 가지므로 개별 원소 수정은 불가
    • 하지만 새로운 Index 객체로 전체 교체는 가능
    • 집합 연산 지원 (교집합, 합집합 등 가능)
import pandas as pd

# Series 생성
s = pd.Series([10, 20, 30], index=["a", "b", "c"])
print("원래 Series:\n", s)

# 불변성 확인 (부분 수정 불가)
try:
    s.index[0] = "z"
except TypeError as e:
    print("부분 수정 오류 발생:", e)

# 전체 교체 (가능)
s.index = ["x", "y", "z"]
print("전체 교체 후 Series:\n", s)

# 집합 연산
print("Index 합집합:", s.index.union(["y", "w"]))

 


2. DataFrame객체의 index 속성

  • 정의: DataFrame의 row labels를 담는 객체
  • 자료형: pandas.Index
  • 특징:
    • Series.index와 동일하게 불변: 개별 수정 불가
    • 새로운 Index 객체로 전체 교체 가능
    • slicing, sorting, filtering 등에 활용

DataFrame 객체 생성시
명시적으로 index를 지정하지 않으면,
RangeIndex객체가 자동으로 설정됨.
이는 [0, n-1]의 자연수 index임.

DataFrameset_index() 메서드로 명시적으로 특정 column을 index로 설정가능하며,
reset_index() 메서드로 현재의 index를 column으로 보내거나(drop=False) 아예 삭제(drop=True)하고, 새로운 RangeIndex객체를 생성하여 index속성을 초기화할수도 있음.

2023.09.20 - [Python/pandas] - [Pandas] Index 지정 관련 메서드 : reset_index, set_index

 

[Pandas] Index 지정 관련 메서드 : reset_index, set_index

DataFrame 인스턴스에서 index를 새로 만들거나 다른 column을 index로 지정하는데 사용된다.reset_indexDataFrame 인스턴스에서 기존 index 대신하는 새로운 index를 만든다.drop 파라메터의 값을 True로 지정한

ds31x.tistory.com

 

다음을 실행시켜 결과를 확인하라.

# DataFrame 생성
df = pd.DataFrame({
    "Name": ["Alice", "Bob", "Charlie"],
    "Age": [25, 30, 35]
}, index=["id1", "id2", "id3"])

print("원래 DataFrame:\n", df)

# 불변성 확인 (부분 수정 불가)
try:
    df.index[0] = "idx0"
except TypeError as e:
    print("부분 수정 오류 발생:", e)

# 전체 교체 (가능)
df.index = ["idx1", "idx2", "idx3"]
print("전체 교체 후 DataFrame:\n", df)

3. DataFrame 객체의 columns 속성

  • 정의: DataFrame의 column의 labels 를 담는 객체
  • 자료형: pandas.Index
  • 특징:
    • immutable 성질을 가짐: 개별 수정 불가
    • 전체 교체는 가능
    • 집합 연산 지원
print("원래 columns:", df.columns)

# 불변성 확인 (부분 수정 불가)
try:
    df.columns[0] = "FullName"
except TypeError as e:
    print("부분 수정 오류 발생:", e)

# 전체 교체 (가능)
df.columns = ["FullName", "Years"]
print("전체 교체 후 DataFrame:\n", df)

# 집합 연산
print("열 이름 교집합:", df.columns.intersection(["Years", "City"]))

 


4. rename() 를 통한 부분 라벨 변경 (partial label renaming)

  • 목적: 전체 교체 없이 일부 index/columns 라벨만 선택적으로 변경
  • 동작:
    • 존재하지 않는 label을 변경대상으로 지정시 기본적으로 무시(errors='ignore').
    • 변경대상으로 지정되지 않은 나머지 labels는 보존.

시그니처(signature, pandas 2.x 기준)

DataFrame.rename(
    mapper=None, *,
    index=None, columns=None,
    axis=None, copy=None,
    inplace=False, level=None,
    errors='ignore'
)

파라미터 설명

  • mapper: dict-like 또는 callable 객체
    • axis 파리미터와 함께 사용 권장.
    • axis로 지정한 축의 labels를 일괄 변경
    • 권장: 혼동 방지를 위해 index= 또는 columns=를 사용 (서로 배타적)
  • axis: {0/'index', 1/'columns'}
    • mapper와 함께 사용할 때 대상 축 지정 (지정 안하면 mapper는 row에 적용됨.)
    • 아래의 index/columns와 동시에 사용하지 않음(배타적)
  • index: dict-like 또는 callable 객체
    • row labels 변경
    • axis 파리미터와 배타적.
    • 예) index={'old_idx':'new_idx'} 또는 index=str.upper
  • columns: dict-like 또는 callable 객체
    • column labels 변경
    • axis 파리미터와 배타적.
    • 예) columns={'old':'new'} 또는 columns=str.lower
  • level:
    • MultiIndex에서 특정 레벨만 변경
    • 정수 레벨 또는 레벨 이름(=level label)
  • inplace:
    • True면 원본에서 직접 변경, False면 새 객체 반환
    • 기본: False
  • copy: (버전에 따라 의미 변화 가능) 새 객체 반환 시 복사 여부 힌트 (자주 바뀐 터라... 사용하지 말길 권장.?)
  • errors:
    • {'ignore','raise'}
    • 매핑에 없는 라벨을 무시할지/에러를 낼지 (기본 'ignore')
import pandas as pd

df = pd.DataFrame(
    {"FullName": ["Alice", "Bob"], "Years": [25, 30]},
    index=["idx1", "idx2"]
)

# 1) columns 일부만 dict로 변경
df1 = df.rename(columns={"FullName": "Name"})
# 결과: columns -> ['Name', 'Years']

# 2) index 일부만 dict로 변경
df2 = df.rename(index={"idx1": "row1"})
# 결과: index -> ['row1', 'idx2']

# 3) 함수로 일괄 변경 (columns를 대문자로)
df3 = df.rename(columns=str.upper)
# 결과: columns -> ['FULLNAME', 'YEARS']

# 4) mapper + axis 사용 (권장하진 않지만 가능)
df4 = df.rename(mapper=str.lower, axis="columns")
# 결과: columns -> ['fullname', 'years']

# 5) MultiIndex level 지정 (예시)
cols = pd.MultiIndex.from_tuples([("meta", "FullName"), ("data", "Years")])
df_mi = pd.DataFrame([["Alice", 25], ["Bob", 30]], columns=cols)
df_mi2 = df_mi.rename(columns={"meta": "info"}, level=0)
# 결과: level=0의 'meta' -> 'info'

4. 요약

index속성과 columns속성 모두 the collection of labels.

  • Series.index: Series의 row labels
  • DataFrame.index: DataFrame의 row labels
  • DataFrame.columns: DataFrame의 column labels
  • 세 속성 모두 pandas.Index 객체임.
    • 개별 원소 수정은 불가 (immutable)
    • 새로운 Index 객체로 전체 교체는 가능
    • 집합 연산 지원

관련된 methods는 다음과 같음:

  • set_index()로 특정 컬럼을 인덱스로 설정
  • reset_index()로 인덱스를 컬럼으로 이동/삭제하고 RangeIndex로 초기화 가능
  • rename()로 일부 라벨만 선택적 변경 (dict 매핑 또는 callable, errors='ignore' 기본)

같이 보면 좋은 자료들

 

728x90