TIL

👀Today I Learn

멀티 인덱스와 복합 인덱스

1. 멀티 인덱스(MultiIndex)란?

  • 하나 이상의 인덱스를 사용하여 데이터 프레임의 행과 열을 구조화
  • 다차원 데이터를 보다 효율적으로 관리하고 분석 가능하게 함


2. 멀티 인덱스 생성하기

set_index()

  • 여러 열을 사용해 멀티 인덱스 설정 가능

      # '도시'와 '년도'를 멀티 인덱스로 설정
      df_multi_index = df.set_index(['도시', '년도'])
    
    • 도시와 년도가 인덱스로 설정되어, 데이터가 더 구조화된 형태

from_tuples()

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

      # 멀티 인덱스를 튜플로 직접 생성
      index = pd.MultiIndex.from_tuples([('서울', 2021), ('서울', 2022), ('부산', 2021), ('부산', 2022)], names = ["도시", "년도"])
        
      # 데이터프레임에 적용
      df_multi_index = pd.DataFrame({'인구수': [9700000, 9720000, 3400000, 3450000]}, index=index)
    


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

loc[]

  • 멀티 인덱스 안에서 특정 데이터 선택 가능

      # 특정 인덱스의 데이터 선택
      df_multi_index.loc['서울']
    
  • 하위 레벨까지 지정하여 더 구체적인 접근 가능

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

슬라이싱(Slicing)

  • 슬라이싱을 통해 특정 구간의 데이터를 쉽게 선택 가능

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

xs()

  • 멀티 인덱스 교차 선택
  • 특정 레벨에서 데이터를 선택하거나, 레벨을 넘어서 데이터를 선택할 때 유용

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


4. 복합 인덱스(MultiIndex) 활용

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

  • 데이터프레임은 정렬된 상태로 관리하는 것이 일반적
  • sort_index()로 인덱스를 정렬 가능

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


인덱스 변환

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

      # 멀티 인덱스를 열로 변환 (unstack)
      df_unstacked = df_multi_index.unstack(level='년도')
    
  • stack()을 사용하면 다시 인덱스 변환 가능

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


5. 멀티 인덱스의 응용

그룹화(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()
    


데이터프레임 구조화 다시하기와 크기 조정하기

1. 데이터프레임 구조화 다시하기

  • 데이터프레임의 구조를 재조정하여, 데이터를 원하는 형태로 변형
  • 주요 작업
    • 피벗(pivot)
    • 변경(melt)
    • 스택(stack)과 언스택(unstack)

피벗 테이블 생성

  • pivot() 을 사용
  • 열 데이터를 행 또는 열로 이동시켜 새로운 데이터프레임을 만듦
  • 데이터를 재구성하고 분석하는데 매우 유용

      # '도시'를 기준으로 '날짜'를 인덱스로, '온도'를 값으로 하는 피벗 테이블 생성
      pivot_df = df.pivot(index='날짜', columns='도시', values='온도')
    
    • 날짜를 인덱스로, 도시를 열로 하여 각 온도 값을 피벗 테이블로 변환

데이터 구조 해체

  • melt()를 사용
  • 피벗된 데이터를 다시 긴 형식(long format)으로 변환할 때 사용
  • 여러 열을 하나의 열로 통합하는 데 유용

      # 데이터프레임 구조 해체 (melt)
      melted_df = pd.melt(df, id_vars=['날짜', '도시'], value_vars=['온도', '습도'])
    
    • 온도와 습도 열이 하나의 열(variable)로 통합 melt()

데이터 변환

  • stack()unstack()을 사용
    • stack() : 열 데이터를 인덱스의 하위 레벨로 이동
    • unstack(): stack() 과 반대 작업을 수행
      # '도시' 레벨을 인덱스로 스택(stack)
      stacked_df = pivot_df.stack()
      print(stacked_df)
      # >>**도시**가 인덱스로 변환
        
      # 다시 언스택(unstack)하여 원래 구조로 복원
      unstacked_df = stacked_df.unstack()
      print(unstacked_df)
      # >> 원래의 **피벗 테이블** 형태로 돌아옴
        
    


2. 데이터프레임 크기 조정하기

  • 데이터프레임의 크기를 조정하여 데이터를 분석하기에 적합한 형태로 조정

행과 열 추가

  • 새로운 열을 추가할 때는 새로운 데이터를 할당하면 됨
  • df['새로운 열'] = 값 의 형태로 추가 가능

      # 새로운 열 추가
      df['날씨'] = ['맑음', '흐림', '맑음', '흐림']
      # >> 새로운 열(날씨)이 추가
    

행과 열 삭제하기

  • 행과 열 삭제는 drop() 함수를 사용
  • axis=0은 행을, axis=1은 열을 삭제

      # '습도' 열 삭제
      df_dropped = df.drop(columns=['습도'])
      # >> 습도 열이 삭제
    
      # 특정 행 삭제 (예: 첫 번째 행)
      df_dropped_row = df.drop(index=0)
      # >> 첫 번째 행이 삭제
    

데이터 병합

  • 데이터프레임을 병합할 때는 concat()merge()를 사용
  • 데이터를 추가하거나 병합하는 데 사용

      # 행을 기준으로 데이터프레임 병합 (concat)
      merged_df = pd.concat([df, df2], ignore_index=True)
        
      # >> 새로운 데이터가 병합되어 데이터프레임의 크기가 **확장됨**
    



💡Today I Thought

오늘의 체크리스트

  • 머신러닝 과제 마무리
  • TIL 작성

회고

  저번 챕터 때 판다스 공부 좀 더 할껄 싶었던 이번주ㅎㅎ 다음 챕터에 가서는 이번 챕터를 또 후회하겠지ㅠㅠ

댓글남기기