반응형
안녕하세요. 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 데이터의 파일 입출력에 대해 알아볼 예정입니다.
감사합니다.
반응형
'데이터 분석 > Pandas' 카테고리의 다른 글
[Pandas 기초]6.Pandas DataFrame 산술 연산 (2) | 2019.08.22 |
---|---|
[Pandas 기초]5.Pandas 데이터 파일 입출력 (3) | 2019.08.20 |
[Pandas 기초]3.Pandas의 자료구조-DataFrame (0) | 2019.08.15 |
[Pandas 기초]2.Pandas의 자료구조-Series (0) | 2019.08.15 |
[Pandas 기초]1.Pandas 란 무엇인가? (0) | 2019.08.13 |