위와 같은 엑셀 파일이 있을 때, pandas로 쉽게 읽고, 처리하는 방법에 대해 알아보겠습니다.
두 사진 모두 Pandas에선 Multiindex 형태라고 지칭합니다. 좀 더 자세히 말하자면, 첫 번째 엑셀은 Multi column 형태입니다. 즉, 열(column)이 여러 계층(Multiple)으로 이루어져 있습니다. 두 번째 엑셀은 Multi index 형태입니다. 행과 열 앞부분인 인덱스(index) 부분이 여러 계층(Multiple)으로 이루어집니다. 위의 예시를 직접 pandas로 읽고 처리하며 자세히 알아보겠습니다.
읽기
첫 번째 엑셀(Multi Column)
데이터 프레임 역시 Multi Column을 갖는 것을 볼 수 있습니다. pd.read_excel함수로 엑셀을 읽을 수 있습니다.
pd.read_excel('multi_index_column.xlsx',header=[0,1,2])
위의 코드를 보면, column부분이 3개의 계층으로 이루어져 있습니다. header=[0,1,2] 옵션으로 위의 데이터 프레임처럼 읽어올 수 있습니다.
먼저, 칼럼의 타입(type)은 Pandas의 MultiIndex라는 것을 알 수 있습니다. 해당 데이터 프레임의 columns를 보면 위처럼 튜플 형태로 나오며, 계층의 순서가 튜플의 원소로 들어있는 것을 볼 수 있습니다. 첫 번째 줄을 보면 0번째에 Information, 1번째에 1차, 2번째에 Job이 있습니다.
두 번째 엑셀(Multi Index)
위 데이터 프레임의 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개의 계층으로 가져옵니다.
칼럼은 평범한 1차원 배열이고, type은 Index입니다.
반면 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([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 번째의 인덱스를 열의 값으로 삽입합니다.
'Data Science & Analysis > Pandas' 카테고리의 다른 글
[Pandas] Dataframe의 행을 반복하는 방법 (iterrows, itertuples, index, loc, iloc) (0) | 2022.07.13 |
---|---|
[Pandas] JSON 읽고 DataFrame으로 상호 변환하기 (1) | 2022.03.30 |
[Pandas] 리스트(list) 순서로 데이터프레임 정렬 (0) | 2020.09.14 |
[Pandas] Dataframe 비교 - 부분비교와 전체비교 (3) | 2020.08.13 |
[Pandas] str.extract, str.contains 정규표현식 사용 (0) | 2020.08.06 |