반응형

안녕하세요. PSYda 입니다.

이번 포스팅에서는 두 개의 DataFrame을 연결하는 Join 기법에 대해 알아보겠습니다.

소개할 내용은 아래와 같습니다.

  • 컬럼 기준 Join
  • Index 기준 Join
  • 행기준 Join
  • Inner, Left, Right ,Outer Join

3. DataFrame Join

Join 이란?

  • 두 개의 DataFrame을 합치는 것
  • 열기준 컬럼명으로 합치기 : merge
  • 열기준 Index명로 합치기 : merge, concat
  • 행기준으로 합치기 : concat, append

합치는 방법은?

  • Inner : 두 DataFrame의 기준 컬럼에서 둘 다 존재하는 데이터만 Join
  • Left Outer join : 왼쪽 DataFrame으로 합치기
  • Right Outer Join : 오른쪽 DataFrame으로 합치기
  • Outer Join : 두 DataFrame의 모든 Data를 합치기

Merge 명령어 사용법?

  • pd.merge(left, right, how, on, left_on, right_on, left_index, right_index)
  • left : Merge 할 왼쪽 DataFrame
  • right : Merge 할 오른쪽 DataFrame
  • how : inner, left, right, outer
  • on : 두 DataFrame을 Join할 기준 컬럼명(컬럼명이 동일할 경우)
  • left_on : Join할 기준 컬럼의 왼쪽 DataFrame의 컬럼명
  • right_on : Join할 기준 컬럼의 오른쪽 DataFrame의 컬럼명
  • left_index : 왼쪽 DataFrame index로 Join할 경우 True
  • right_index : 오른쪽 DataFrame index로 Join할 경우 True

concat 명령어 사용법?

  • pd.concat([left,right], axis, join,...)
  • [left,right] : left DataFrame과 right DataFrame으로 이루어진 List
  • axis = 0 : 행기준으로 합치기, 1: 열기준으로 Index명으로 합치기

pandas libary를 import 합니다.

import pandas as pd
from pandas import Series, DataFrame

3.1 같은 Column끼리 합치기

DF1 = DataFrame([["싸이",180,75],["덕구",160,65],["또치",170,75]], columns = ["이름","키","몸무게"])
DF1

이름 몸무게
0 싸이 180 75
1 덕구 160 65
2 또치 170 75
DF2 = DataFrame([["싸이","포워드","잘함"],["덕구","미드필더","못함"],["똥갈","수비수","잘함"]], columns = ["이름","포지션","실력"])
DF2

이름 포지션 실력
0 싸이 포워드 잘함
1 덕구 미드필더 못함
2 똥갈 수비수 잘함

3.1.1 Inner Join

두 DataFrame의 기준 컬럼에서 둘 다 존재하는 데이터만 Join

pd.merge(left = DF1 , right = DF2, how = "inner", on = "이름")

이름 몸무게 포지션 실력
0 싸이 180 75 포워드 잘함
1 덕구 160 65 미드필더 못함

3.1.2 Left Outer Join

  • 왼쪽 DataFrame의 모든 데이터 출력 +
  • 오른쪽 DataFrame 중 왼쪽 DataFrame에 있는 Data는 출력
  • 오른쪽 DataFrame 중 왼쪽 DataFrame에 없는 Data는 NaN으로 처리

pd.merge(left = DF1 , right = DF2, how = "left", on = "이름")

몸무게 포지션 실력
이름
싸이 180 75 포워드 잘함
덕구 160 65 미드필더 못함
또치 170 75 NaN NaN

3.1.3 Right Outer Join

  • 오른쪽 DataFrame의 모든 데이터 출력 +
  • 왼쪽 DataFrame 중 오른쪽 DataFrame에 있는 Data는 출력
  • 왼쪽 DataFrame 중 오른쪽 DataFrame에 없는 Data는 NaN으로 처리

pd.merge(left = DF1 , right = DF2, how = "right", on = "이름")

이름 몸무게 포지션 실력
0 싸이 180.0 75.0 포워드 잘함
1 덕구 160.0 65.0 미드필더 못함
2 똥갈 NaN NaN 수비수 잘함

3.1.4 Outer Join

  • 왼쪽, 오른쪽 DataFrame의 모든 데이터 출력 +
  • 왼쪽 DataFrame 중 오른쪽 DataFrame에 있는 Data는 NaN으로 처리
  • 오른쪽 DataFrame 중 왼쪽 DataFrame에 없는 Data는 NaN으로 처리

DF1과 DF2를 Outer Join

pd.merge(left = DF1 , right = DF2, how = "outer", on = "이름")

이름 몸무게 포지션 실력
0 싸이 180.0 75.0 포워드 잘함
1 덕구 160.0 65.0 미드필더 못함
2 또치 170.0 75.0 NaN NaN
3 똥갈 NaN NaN 수비수 잘함

3.2 같은 Index 기준으로 합치기

  • set_index("컬럼명") : 컬럼명의 데이터가 Index로 설정, 컬럼데이터는 삭제
DF1 = DF1.set_index("이름")
DF1

몸무게
이름
싸이 180 75
덕구 160 65
또치 170 75
DF2 = DF2.set_index("이름")
DF2

포지션 실력
이름
싸이 포워드 잘함
덕구 미드필더 못함
똥갈 수비수 잘함
pd.merge(left = DF1, right = DF2, left_index = True, right_index = True, how = "inner")

몸무게 포지션 실력
이름
싸이 180 75 포워드 잘함
덕구 160 65 미드필더 못함
pd.concat([DF1,DF2],axis = 1, join = 'inner')

몸무게 포지션 실력
이름
싸이 180 75 포워드 잘함
덕구 160 65 미드필더 못함

3.3 행기준으로 합치기

  • 같은 컬럼명이 존재하면, 데이터 저장
  • 다른 컬럼명이 존재하면, 해당 컬럼이 있는 DataFrame은 데이터 저장, 없는 DataFrame은 NaN 처리
  • 일반적으로 concat보다 append가 더 빠름
DF3 = DataFrame([[187, 80, 30], [190,85, 20]], columns = ["키","몸무게","나이"], index = ["거북이","깜디"])
DF3

몸무게 나이
거북이 187 80 30
깜디 190 85 20
DF1.append(DF3, sort=False)

몸무게 나이
싸이 180 75 NaN
덕구 160 65 NaN
또치 170 75 NaN
거북이 187 80 30.0
깜디 190 85 20.0
pd.concat([DF1, DF3], axis = 0, sort=False)

몸무게 나이
싸이 180 75 NaN
덕구 160 65 NaN
또치 170 75 NaN
거북이 187 80 30.0
깜디 190 85 20.0

위의 Jupyter notebook 내용은 여기 Github에서도 확인 할 수 있습니다.

다음 포스팅은 Pandas 데이터의 파일 입출력에 대해 알아볼 예정입니다.

감사합니다.

반응형

+ Recent posts