Python to AI

Python - Pandas(다차원데이터관리 : MultiIndex)

최 수빈 2024. 12. 17. 17:34

 

멀티 인덱스(MultiIndex)

 

하나 이상의 인덱스를 사용하여 데이터프레임의 행과 열을 구조화하는 방법

 

 

다차원 데이터를 보다 효율적으로 관리하고 분석할 수 있게 해준다.

 

 

set_index()로 멀티 인덱스 설정

#멀티 인덱스 생성
import pandas as pd

#예시 프레임 생성
data = {
    '도시' = ['서울', '서울', '부산', '부산'],
    '년도' = [2021, 2022, 2021, 2022],
    '인구수' = [970000, 9720000, 3400000, 3450000]
    }
    
df = pd.DataFrame(data)

#'도시'와 '년도'를 멀티 인덱스로 설정
df_multi_index = df.set_index(['도시','년도'])
df_multi_index

 

도시와 년도가 인덱스로 설정되어, 데이터가 더 구조화된 형태로 보임

 

 

 

pd.MultiIndex.from_tuple()로 멀티 인덱스 생성

- from_tuples()를 사용해 튜플로 구성된 멀티 인덱스 생성가능

#멀티 인덱스를 튜플로 직접 생성
index = pd.MultiIndex.from_tuples([('서울', 2021), ('서울', 2022), ('부산', 2021), ('부산', 2022)], names = ['도시', '년도'])

#데이터프레임에 적용
df_multi_index = pd.DataFrame({'인구수' : [99700000, 9720000, 3400000, 3459999]}, index = index)
df_multi_index

 

멀티 인덱스 데이터 접근하기

 

loc[]을 사용한 데이터 접근 -> 멀티 인덱스에서 특정 데이터 선택 가능

#특정 인덱스의 데이터 선택
df_multi_index.loc['서울']

 

하위 레벨까지 지정하여 데이터를 더 구체적으로 접근 가능

#'서울'의 2021년 데이터 선택
df_multi_index.loc[('서울', 2021)]

 

 

슬라이싱(Slicing)으로 데이터 접근

멀티 인덱스는 슬라이싱을 통해 특정 구간의 데이터를 쉽게 선택할 수 있음

#부산의 모든 데이터를 선택
df_multi_index = df_multi_index.sort_index()
df_multi_index.loc['부산':'부산']

 

 

Pandas는
단일 값 조회 시, 해당 인덱스 레벨을 자동으로 제거하는 성질을 가짐
슬라이싱 조회는 범위를 지정하기 때문에, 인덱스 레벨을 그대로 유지

 

 

xs()를 사용한 멀티 인덱스 교차 선택

특정 레벨에서 데이터를 선택하거나, 레벨을 넘어서 데이터를 선택할 때 유용

#'도시'레벨에서 '서울'데이터를 선택
df_multi_index.xs('서울', level ='도시')

 

복합 인덱스(MultiIndex)활용

 

인덱스 정렬 및 정렬된 상태 확인

멀티 인덱스를 사용한 데이터프레임은 정렬된 상태로 관리하는 것이 일반적 - sort_index()로 인덱스 정렬

#멀티 인덱스 정렬
df_sorted = df_multi_index.sort_index()
df_sorted

unstack(), stack()으로 인덱스 변환

 

unstack() : 멀티 인덱스를 열로 변환

stack() : 열을 인덱스로 변환

 

#멀티 인덱스의 열을 인덱스로 변환
df_unstacked = df_multi_index.unstack(level = '년도')
df_unstacked

#다시 인덱스로 변환(stack)
df_stacked = df_unstacked.stack(future_stack = True)
df_stacked

stack()메서드 구현이 바뀐단다.

FutureWarning이라 지금은  결과가 나온다.

나중에는 stack()을 호출할 때  future_stack = True를 명시적으로 전달해줘야한다는 듯

Warning꼴보기 싫어서 위의 예시코드처럼 future_stack = True 라고 적어주고 돌렸다. 

Warrning이 사라졌다. 좋다.

 

 

 

 

멀티 인덱스의 응용

 

그룹화(Grouping)와 함께 사용

멀티 인덱스는 그룹화와 함께 사용할 때 더 강력해짐 - 그룹화한 데이터를 멀티 인덱스로 변환하여 복잡한 분석 수행

#데이터프레임 생성
data = {
    '도시' : ['서울', '서울', '부산', '부산', '서울', '부산'],
    '년도' : [2021, 2022, 2021, 2022, 2021, 2022],
    '인구수' : [9700000, 9720000, 3400000, 3450000, 9800000, 3500000],
    '소득' : [60000, 62000, 45000, 46000, 63000, 47000]}
    
df = pd.DataFrame(data)

#'도시'와 '년도'를 기준으로 그룹화하여 평균 계산
grouped_df = df.groupby(['도시', '년도']).mean()
grouped_df

 


예시코드에 사용된 데이터값은 임의의 숫자일 뿐 사실이 아님