Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Pandas – 멀티인덱스(MultiIndex) 열 인덱스에서 특정 레벨 삭제하기

Pandas에서 다중 레벨(multi-level) 열 인덱스를 가진 데이터프레임에서 특정 레벨을 제거하려면 columns.droplevel() 메서드를 사용합니다. 또한 MultiIndex.from_tuples()를 활용하면 튜플 기반으로 열 방향(column-wise)의 멀티인덱스를 손쉽게 생성할 수 있습니다.

이 글에서는 멀티인덱스 데이터프레임을 직접 만들어 보고, 열 인덱스에서 원하는 레벨을 삭제하는 전체 과정을 단계별로 살펴보겠습니다.

1단계: 열 방향 멀티인덱스 생성

pd.MultiIndex.from_tuples()를 사용해 열에 적용할 멀티인덱스를 먼저 정의합니다.

items = pd.MultiIndex.from_tuples([("Col 1", "Col 1", "Col 1"),("Col 2", "Col 2", "Col 2"),("Col 3", "Col 3", "Col 3")])

2단계: 멀티인덱스 배열 준비 및 데이터프레임 생성

행 인덱스로 사용할 두 개의 배열(차량 종류와 값 구분)을 만들고, 이를 바탕으로 멀티인덱스 데이터프레임을 구성합니다.

arr = [np.array(['car', 'car', 'car','bike','bike', 'bike', 'truck', 'truck', 'truck']),
    np.array(['valueA', 'valueB', 'valueC','valueA', 'valueB', 'valueC','valueA', 'valueB', 'valueC'])]

# 멀티인덱스 데이터프레임 생성
dataFrame = pd.DataFrame(np.random.randn(9, 3), index=arr, columns=items)

3단계: 행 인덱스 이름 지정

각 인덱스 레벨에 이름을 부여하면 결과를 해석하기가 훨씬 쉬워집니다.

dataFrame.index.names = ['level 0', 'level 1']

4단계: droplevel()로 레벨 삭제

droplevel(0)을 호출하면 가장 바깥쪽(0번째) 열 레벨이 제거됩니다. 음수 인덱스도 지원하므로 droplevel(-1)처럼 작성하면 가장 안쪽 레벨을 삭제할 수 있습니다. 참고로 행 인덱스의 레벨을 삭제할 때는 index.droplevel()을 사용하면 됩니다.

dataFrame.columns = dataFrame.columns.droplevel(0)

전체 예제 코드

지금까지의 과정을 하나로 합친 완전한 코드는 다음과 같습니다.

import numpy as np
import pandas as pd

# 열 방향 멀티인덱스 생성
items = pd.MultiIndex.from_tuples([("Col 1", "Col 1", "Col 1"),("Col 2", "Col 2", "Col 2"),("Col 3", "Col 3", "Col 3")])

# 멀티인덱스 배열
arr = [np.array(['car', 'car', 'car','bike','bike', 'bike', 'truck', 'truck', 'truck']),
  np.array(['valueA', 'valueB', 'valueC','valueA', 'valueB', 'valueC','valueA', 'valueB', 'valueC'])]

# 멀티인덱스 데이터프레임 생성
dataFrame = pd.DataFrame(np.random.randn(9, 3), index=arr, columns=items)

# 인덱스 이름 지정
dataFrame.index.names = ['level 0', 'level 1']
print("DataFrame...\n", dataFrame)

print("\nDropping a level...\n")
dataFrame.columns = dataFrame.columns.droplevel(0)

print("Updated DataFrame..\n", dataFrame)

실행 결과

위 코드를 실행하면 아래와 같은 출력이 나타납니다. 첫 번째 결과에서는 세 개의 동일한 열 레벨(Col 1~3)이 반복되어 표시되지만, droplevel(0) 실행 후에는 해당 레벨이 사라져 열 헤더가 한 단계 단순해진 것을 확인할 수 있습니다.

DataFrame...
                   Col 1     Col 2     Col 3
                   Col 1     Col 2     Col 3
                   Col 1     Col 2     Col 3
level 0  level 1
car      valueA  1.691127  0.315145 -0.695925
        valueB -2.077182 -2.027643 -0.523965
        valueC  1.021402 -0.384421  0.640215
bike    valueA -2.271217  0.197185  0.304847
        valueB  0.119615 -0.520491 -0.746547
        valueC  1.856888 -0.491540 -1.754604
truck   valueA  0.829854 -0.204102 -1.130511
        valueB  0.310692  0.119087 -0.244919
        valueC -0.245934 -2.141639 -1.298278

Dropping a level...

Updated DataFrame..
                  Col 1     Col 2     Col 3
                  Col 1     Col 2     Col 3
level 0  level 1
car      valueA  1.691127  0.315145 -0.695925
        valueB -2.077182 -2.027643 -0.523965
        valueC  1.021402 -0.384421  0.640215
bike    valueA -2.271217  0.197185  0.304847
        valueB  0.119615 -0.520491 -0.746547
        valueC  1.856888 -0.491540 -1.754604
truck   valueA  0.829854 -0.204102 -1.130511
        valueB  0.310692  0.119087 -0.244919
        valueC -0.245934 -2.141639 -1.298278

마무리

droplevel()은 멀티인덱스 데이터프레임을 정리할 때 매우 유용한 메서드입니다. 불필요한 중복 레벨을 제거하면 열 구조가 간결해지고, 이후 그룹화·피벗·시각화 등의 후속 처리 작업도 훨씬 수월해집니다. 필요에 따라 여러 레벨을 한 번에 삭제하려면 droplevel([0, 1])처럼 리스트 형태로 전달할 수 있다는 점도 기억해 두면 좋습니다.