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

Pandas 데이터프레임 멀티레벨 열 인덱스에서 여러 레벨 삭제하는 방법

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)을 두 번 호출할 때마다 열 인덱스의 최상위 레벨이 하나씩 제거되어, 마지막에는 단일 레벨 열 인덱스만 남게 됩니다.