매일공부

[Python Pandas] Dataframe 다중 인덱스 & 병합, 연결 본문

Programming/Python

[Python Pandas] Dataframe 다중 인덱스 & 병합, 연결

aram 2022. 9. 14. 00:28

다중 인덱스(multi-index)

- 행과 열에 다중 인덱스 정의 할 수 있음

- columns(index) 인수에 리스트의 리스트(행렬) 형태 = 다중 열(행) 인덱스

- 열(행) 인덱스들의 이름 지정 = columns(index) 객체의 names 속성리스트를 넣어서 지정

import pandas as pd
np.random.seed(0) 
df4 = pd.DataFrame(
        np.round(np.random.randn(6, 4), 2), 
                 columns=[["A", "A", "B", "B"], ["C", "D", "C", "D"]], 
                 index=[["M", "M", "M", "F", "F", "F"], 
                        ["id_" + str(i + 1) for i in range(3)] * 2]) 
df4.columns.names = ["Cidx1", "Cidx2"] 
df4.index.names = ["Ridx1", "Ridx2"] 
print(df4)

 

Dataframe 행 인덱스와 열 인덱스 교환

- unstack
  =
 다중 인덱스 하나의 인덱스를 열 인덱스로 전환 
  = 가로로 데이터를 늘려줌
  = 행 인덱스가 시계 방향으로 90도 회전

- stack
   =
열 다중 인덱스 중 하나의 인덱스를 행 인덱스로 전환
   = 세로로 데이터를 늘려줌
   = 열 인덱스가 반시계 방향으로 90도 회전

- 인덱스 지정 시 > 문자열 이름과 순서를 표시하는 숫자 인덱스를 모두 사용 가능

 

Dataframe 다중 인덱스의 인덱싱

- 다중 인덱스를 가지는 경우 > ()로 둘러싸인 튜플이 되어야 함

- loc 인덱스를 사용하는 경우에도 튜플 사용 
  =  하나의 열이나 행을 선택할때  loc[(상위인덱스, 하위인덱스) , (상위인덱스, 하위인덱스)]

- 슬라이싱  :  대신,  loc[(상위인덱스, slice(None) , (상위인덱스, 하위인덱스)]

- 위치 기반 정수 인덱스 == iloc 인덱스
  > 튜플 형태의 다중인덱스사용할 수 없

- 하나의 레벨 값만 = 다중 인덱스 중에서 가장 상위의 값을 지정

 

Dataframe 다중 인덱스의 인덱스 순서 교환

- Dataframe객체.swaplevel( , , axis=0)
  :  정의된 다중 인덱스의 상위 하위 인덱스를  교환 
  > axis는 0일 때 행 인덱스

- Dataframe객체.sort_index(axis=, level=)
  : 다중 인덱스가 있는 데이터프레임으로 정렬
  : level 인수는 어떤 인덱스를 기준으로 정렬하는지 설정

 


 

Dataframe 데이터 병합(merge), 연결(concatenate)

- merge(leftdf1, rightdf2, how='inner') 

  • 두 데이터 프레임의 공통 열 혹은 인덱스를 기준으로 두 개의 테이블을 합친다
  • 키(key) = 기준이 되는 열, 행의 데이터

  • how='outer'  > 합집합 (컬럼의 없는 데이터는 NaN처리 된다.)
  • how='inner'  > 교집합 
  • how='left'  > 왼쪽기준 차집합
  • how='right'  > 오른쪽기준 차집합

  • on옵션 : 컬럼 또는 특정 인덱스를 기준으로 결합
  • 키가 되는 기준열의 이름이 두 데이터프레임에서 다르다면 > left_on, right_on 인수를 사용하여 기준열 명시
  • 일반 데이터 열이 아닌 인덱스를 기준열로 사용하려면 left_index 또는 right_index 인수를 True 로 설정
  • indicator ='컬럼명' (both, left_only, right_only)
    : 각 속성의 교집합, 왼쪽차집합, 오른쪽차집합 중에서 속하는 집합 표시
  • Dataframe객체.join(Dataframe객체, how='outer')
     > merge 명령어 대신 join 메서드를 사용 가능
df1 = pd.DataFrame({'고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],
                    '이름': ['둘리', '도우너', '또치', '길동', '희동', '마이콜', '영희']
                    }, columns=['고객번호', '이름'])
print(df1)
df2 = pd.DataFrame({'고객번호': [1001, 1001, 1005, 1006, 1008, 1001],
                    '금액': [10000, 20000, 15000, 5000, 100000, 30000]
                   }, columns=['고객번호', '금액'])
print(df2)

df_merge1 = pd.merge(df1, df2, how='outer', indicator='indicator정보')  # both, left_only, right_only
df_merge1

 

- concat([df1, df2], axis=0)

  • 기준 열(key column)을 사용하지 않고 단순히 데이터 연결(concatenate)
  • axis=0: 행 단위로 이어붙이기 (수직)
  • axis=1 : 열 단위로 연결(수평)
  • 중복된 데이터 = 삭제되지 않음

  • ignore_index = True옵션 >  index 번호 초기화
  • join 옵션 - 교집합 'inner' , 합집합 'outer'

  • DataFrame객체에 Series객체를 이어붙이기(열로 추가)
pd.concat([df1, series객체], axis=1) 
pd.concat([series객체1, series객체2], axis=1)
더보기
sr1 = pd.Series(['1등급','2등급','3등급','4등급'], name = '등급')
sr2 = pd.Series(['YB', 'SW', 'HJ', 'EJ'], name='이름')
df_concat1 = pd.concat([sr2,sr1], axis=1)
print(df_concat1)

df_concat2 = pd.concat([sr2,sr1], axis=0)
print(df_concat2)


# 동일컬럼명에 _x, _y 접미사와 함께 출력됨

df_merge_left = pd.merge(df2, df3, on="이름")
print(df_merge_left)


 # set_index 또는 reset_index 사용할 수 있음 

df_concat2 = pd.concat([df2,df3], ignore_index=True)
print(df_concat2)

 


판다스에 내장된 그래프 도구

  • df.plot(kine='그래프종류')
  • line
  • bar
  • barh
  • his
  • box
  • kde - 커널밀도
  • area -면적
  • pie
  • scatter -산점도
  • hexbin-고밀도 산점도

 

* 내용참고&출처 : 태그의 수업을 복습 목적으로 정리한 내용입니다.

Comments