본문 바로가기

파이선

데이터 준비하기:조인,병합,변형 (chap8)

Pandas의 계층적인 색인 개념을 통해서, 데이터를 관리하자!!

 

  • 계층적 색인
    다중(둘이상)의 색인 단계를 정할수 있다.
    높은차원의 데이타를 낮은 차원의 형식으로 처리함
    • Series의 index를 List의 List(or 배열)로 색인을 구성할수 있다.
      2개의 차이를 보면, 왼쪽 색인 영역이 2개 생긴다고 보면 된다.
    • 하위 계층을 선택하는 것도 가능
      해당 데이타에서 1,2,3 Level의 추출하기
      1,2,3 항목이 있는 경우에만 출력 수행
    • unstack, stack함수 : 행,열을 변경하여서 새롭게 배열 구성
      • T함수도 행,열을 변경하는 것인데, 여기서 동작은 되지 않는다.
    • 인덱스는 크게 4가지 형태로 구성할수 있다.
    • swaplevel : 계층의 순서를 바꾸고 정렬하기
      • frame.swaplevel('key1', 'key2')
      • 실제 데이타가 변경 되는것은 아니다.
    • sort_index : 단일 계층에 속한 데이타를 정렬
      • 잘 이해가 되지 않는다.
    • set_index : 로우의 색인을 DataFrame의 럴럼으로 옮기고 싶을때
      • frame.set_index([ 'c', 'd']) # 기존에 있는 사항은 삭제됨
      • frame.set_index([ 'c', 'd'], drop=false) # 기존에 있는 사항이 유지됨
    • reset_index : set_index로 설정된 사항의 index를 제거한다.
  • 데이터 합치기 (pandas의 데이타를 여러가지 방법으로 합칠 수 있다.)
    • pandas.merge : 하나이상의 키를 기준으로 DataFrame의 로우를 합한다.
      • 기존에 sql에 join과 비슷
      • df1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)}) 
        • key는 임으로 설정한것이고, 지정을 하지 않는다면, 중복된 컬럼명을 사용해서 join한다.
      • pd.merge(df1, df2) : 다대다 join을 의미한다.
      • pd.merge(df1, df2, on='key') : join을 하려고 하는 컬럼을 명확히 지정해주는것이 좋다.
      • pd.merge(df3, df4, left_on='lkey', right_on='rkey'
        • 왼쪽, 오른쪽 컬럼명이 다를때, left_no, right_on으로 설정할 수 있다.
      • how옵션 
        • 기존적으로는 how=inner의 설정이다. 
        • pd.merge(df1, df2, how='outer')
        • inner : 양쪽 테이블 모두 존재하는 key
        • left : 왼쪽 테이블에 존재하는 모든 key
        • right : 오른쪽 테이블에 존재하는 모든 key
        • outer : 양쪽 테이블에 존재하는 모든 key
      • pd.merge(left, right, on='key1', suffixes=('_left', '_right'))
        • key1으로 join이 되는데, 1개의 컬럼으로 보여지는게 아니고 suffixes 값이 붙어서 각각 표시된다.
      • merge 함수 인자 목록
        • P.320에 다양하게 정의됨
    • pandas.concat : 하나의 축을 따라 객체를 이어 붙인다.
    • conbile_first : 인스턴스 메소드는 두 객체를 포개서 한객체에서 누락된 데이타를 다른 객체의 값으로 채운다.
    • 색인 병합하기
      • 컬럼으로 join을 하는것이 아니고, 색인(index)를 통해서 병합을 하는 방식도 있다.
      • (컬럼과 색인)으로 join을 진행할수 있다.
        • pd.merge(lefth, righth, left_on=['key1', 'key2'], right_index=True)
        • pd.merge(left2, right2, how='outer', left_index=True, right_index=True)
      • (색인과 색인)으로도 join을 할수 있겠지
        • join을 사용해서 쉽게 처리 가능하다.
        • left2.join(right2, how='outer')
        • left2.join([right2, another]) : 이렇게 다른 DataFrame을 넣을 수도 있다.
          • 이렇게 되면 left2, right2, another의 사항이 모두 합해서 나온다.
    • 축 따라 이어 붙이기
      • Numpy
        • concatenate 함수 제공
        • np.concatenate([arr, arr], axis=1)
      • Pandas
        • concat함수 제공
        • pd.concat([s1, s2, s3], axis=1)
          • axis=0이 기본값
          • axis=1은 컬럼을 의미 (결과가 Series가 아닌, DataFrame이 된다.)
        • pd.concat([s1, s4], axis=1, join='inner')   # join방식 정하기
        • pd.concat([s1, s1, s3], keys=['one', 'two', 'three'])      # key정하기
        • pd.concat([df1, df2], axis=1, keys=['level1', 'level2'])
          그룹핑 가능
        • pd.concat({'level1': df1, 'level2': df2}, axis=1)
          다른 방식으로 그룹핑 진행
        • pd.concat([df1, df2], axis=1, keys=['level1', 'level2'], names=['upper', 'lower'])
          계층이름에 names을 정할수 있음
        • concat 함수 인자 (P.331)
      • 겹치는 데이타 합치기
        • 병합이나 이어붙이기가 불가능한 상황
        • 두 데이터셋의 색인이 일부 겹치거나, 전체가 겹치는 경우
        • 벡터화된 if-else구문을 표현하는 Numpy의 where함수 
        • np.where(pd.isnull(a), b, a)    # where구문 사용
        • df1.combine_first(df2)            # 객체에서 누락된 데이타를 인자로 넘긴 객체에 있는 값으로 채움
  • 재형성과 피벗 (같은 의미)
    데이터를 재배치하는 다양한 기본연산자 제공
    • stack : 컬럼 → 로우로 회전
    • unstack : 로우 → 컬럼으로 회전
    • periods = pd.PeriodIndex(year=data.year, quarter=data.quarter, name='date')
      • 시간 간격을 나타내기 위한 자료형 (시간과 관련된 여러 데이타가 있으면 이렇게 합해서 1개로 구성)
    • pivot : 
      • 좀더 볼것
    • pandas.melt
      • pivot과 반대되는 개념
      • 넓은 형식에서 긴 형식으로 피벗하는 역활

'파이선' 카테고리의 다른 글

시계열 (chap11)  (0) 2021.09.15
데이타 집계와 그룹연산 (chap10)  (0) 2021.09.06
데이터 정제 및 준비 (chap7)  (0) 2021.09.02
데이터 로딩과 저장, 파일형식 (chap6)  (0) 2021.09.02
pandas 시작하기 (chap5)  (0) 2021.09.01