[Pandas] 다중 인덱스 엑셀 읽기 및 처리 (Multi Index, Multi Column)

반응형

Multi column excel

 

Multi index excel

위와 같은 엑셀 파일이 있을 때, pandas로 쉽게 읽고, 처리하는 방법에 대해 알아보겠습니다.

두 사진 모두 Pandas에선 Multiindex 형태라고 지칭합니다. 좀 더 자세히 말하자면, 첫 번째 엑셀은 Multi column 형태입니다. 즉, 열(column)이 여러 계층(Multiple)으로 이루어져 있습니다. 두 번째 엑셀은  Multi index 형태입니다. 행과 열 앞부분인 인덱스(index) 부분이 여러 계층(Multiple)으로 이루어집니다. 위의 예시를 직접 pandas로 읽고 처리하며 자세히 알아보겠습니다.

 

읽기

첫 번째 엑셀(Multi Column)

header 옵션 부여

데이터 프레임 역시 Multi Column을 갖는 것을 볼 수 있습니다. pd.read_excel함수로 엑셀을 읽을 수 있습니다. 

pd.read_excel('multi_index_column.xlsx',header=[0,1,2])

위의 코드를 보면, column부분이 3개의 계층으로 이루어져 있습니다. header=[0,1,2] 옵션으로 위의 데이터 프레임처럼 읽어올 수 있습니다.

type과 columns

먼저, 칼럼의 타입(type)은 Pandas의 MultiIndex라는 것을 알 수 있습니다. 해당 데이터 프레임의 columns를 보면 위처럼 튜플 형태로 나오며, 계층의 순서가 튜플의 원소로 들어있는 것을 볼 수 있습니다. 첫 번째 줄을 보면 0번째에 Information, 1번째에 1차, 2번째에 Job이 있습니다.

 

두 번째 엑셀(Multi Index)

index_col 옵션 부여

위 데이터 프레임의 Index는 헤더(header)와 값(value)으로 이루어져 있습니다. Information, 차수, 정보를 인덱스의 헤더(header)로 가져옵니다. 값으로는 차수 정보와 Job, Level 등의 정보를 가져옵니다. 인덱스의 Information부분은 값이 nan(결측치) 처리된 것을 볼 수 있습니다.

pd.read_excel('multi_index.xlsx',index_col=[0,1,2])

pd.read_excel() 함수로 엑셀을 읽어오며, index_col=[0,1,2] 인자를 통해 인덱스를 3개의 계층으로 가져옵니다.

컬럼 부분은 평범한 Index 형태

칼럼은 평범한 1차원 배열이고, type은 Index입니다.

index부분의 type과 형태

반면 index부분을 보면, type은 Multiindex이며, index가 names와 값 부분으로 나뉜 것을 볼 수 있습니다. 

 

처리하기

첫 번째 엑셀(Multi Column)

컬럼 정제

위와 같이 column에서 필요한 부분만 가져와 1차원 배열의 칼럼을 만들어 사용하는 것이 편리합니다.

 

list(map(lambda x: ' '.join(x[1:]),df1.columns))

위에서 핵심적인 역할을 한 코드입니다. 코드의 의미는 df1의 Multi index칼럼에 대해, lambda x: ' '. join(x [1:])를 개별 적용하여 리스토로 만드는 코드입니다. map() 함수가 개별 적용을 합니다. 개별 적용이 되는 각 인자(x)는 ('Information' , '1차', Job') 형태의 튜플들입니다. 여기에 x [1:]을 적용하면 ('1차', 'Job')만 남게 되고 이를 join 하여 리스트로 만들면 위의 데이터 프레임 헤더처럼 됩니다.

 

두 번째 엑셀(Multi Index)

reset_index

위처럼 reset_index([0,1,2])를 사용해서 인덱스를 모두 값으로 변환하여 사용합니다.

 

df2.reset_index([0,1,2])

reset_index함수는 인덱스 부분을 0부터 순서대로 리셋해주는 역할을 하며, 기존 인덱스를 첫 번째 열의 값으로 삽입합니다. 이때 [0,1,2]는 level이라는 파라미터 값으로 들어갑니다. level은 인덱스의 계층을 입력받는 옵션입니다. 즉, 위의 코드는 df2.reset_index(level=[0,1,2])와 같은 의미이며, 계층을 이루는 Multiindex에 대해 0,1,2 번째의 인덱스를 열의 값으로 삽입합니다.

반응형

댓글

Designed by JB FACTORY