Pandas 데이터프레임의 멀티레벨(다중 계층) 열 인덱스에서 여러 레벨을 삭제하려면 columns.droplevel() 메서드를 반복해서 호출하면 됩니다. 열 방향(column-wise) 인덱스는 pd.MultiIndex.from_tuples()를 사용해 생성합니다.
1단계: 열 방향으로 인덱스 생성하기
먼저 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()로 레벨 삭제하기
인덱스 위치 0에 해당하는 레벨을 삭제합니다.
dataFrame.columns = dataFrame.columns.droplevel(0)
위 코드가 실행되면 가장 바깥쪽 레벨(레벨 0)이 제거되고, 기존의 레벨 1이 새로운 레벨 0이 됩니다. 따라서 동일한 코드를 한 번 더 실행하면 남아 있는 레벨 역시 삭제할 수 있습니다.
dataFrame.columns = dataFrame.columns.droplevel(0)
참고: droplevel()은 리스트를 인자로 받을 수 있으므로 dataFrame.columns.droplevel([0, 1])처럼 작성하면 여러 레벨을 한 번에 삭제할 수도 있습니다.
전체 예제 코드
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 = ['one', 'two']
print("DataFrame...\n", dataFrame)
print("\n레벨 삭제 중...\n")
dataFrame.columns = dataFrame.columns.droplevel(0)
print("업데이트된 DataFrame..\n", dataFrame)
print("\n또 다른 레벨 삭제 중...\n")
dataFrame.columns = dataFrame.columns.droplevel(0)
print("업데이트된 DataFrame..\n", dataFrame)
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
DataFrame...
Col 1 Col 2 Col 3
Col 1 Col 2 Col 3
Col 1 Col 2 Col 3
one two
car valueA 0.425077 0.020606 1.148156
valueB -1.720355 0.502863 1.184753
valueC 0.373106 1.300935 -0.128404
bike valueA -0.648708 0.944725 0.593327
valueB -0.613921 -0.238730 -0.218448
valueC 0.313042 -0.628065 0.910935
truck valueA 0.286377 0.478067 -1.000645
valueB 1.151793 -0.171433 -0.612346
valueC -1.358061 0.735075 0.092700
레벨 삭제 중...
업데이트된 DataFrame..
Col 1 Col 2 Col 3
Col 1 Col 2 Col 3
one two
car valueA 0.425077 0.020606 1.148156
valueB -1.720355 0.502863 1.184753
valueC 0.373106 1.300935 -0.128404
bike valueA -0.648708 0.944725 0.593327
valueB -0.613921 -0.238730 -0.218448
valueC 0.313042 -0.628065 0.910935
truck valueA 0.286377 0.478067 -1.000645
valueB 1.151793 -0.171433 -0.612346
valueC -1.358061 0.735075 0.092700
또 다른 레벨 삭제 중...
업데이트된 DataFrame..
Col 1 Col 2 Col 3
one two
car valueA 0.425077 0.020606 1.148156
valueB -1.720355 0.502863 1.184753
valueC 0.373106 1.300935 -0.128404
bike valueA -0.648708 0.944725 0.593327
valueB -0.613921 -0.238730 -0.218448
valueC 0.313042 -0.628065 0.910935
truck valueA 0.286377 0.478067 -1.000645
valueB 1.151793 -0.171433 -0.612346
valueC -1.358061 0.735075 0.092700
출력에서 확인할 수 있듯이 droplevel(0)을 두 번 호출할 때마다 열 인덱스의 최상위 레벨이 하나씩 제거되어, 마지막에는 단일 레벨 열 인덱스만 남게 됩니다.