데이터분석

DataFrame, Join Type의 종류, python

still..epochs 2022. 11. 11. 16:52

판다스의 DataFrame은 테이블 형식의 데이터 셋이다. 각 DataFrame이 공통 컬럼(필드)가 존제 한다면, DataFrame 끼리 Join을 할 수 있다.

 

Join의 방식에는 4가지가 존재한다.

1. Outer Join

2. Inner Join

3. Left Join

4. Right Join

 

각각의 방식을 예시 코드를 통해 어떻게 Join이 되는지 알아보자!

import pandas as pd

df1 = pd.DataFrame({'a' : ['a', 'b', 'c'],'b':[1, 2, 3]})
df2 = pd.DataFrame({'a' : ['a', 'b', 'd'],'c':['가', '나', '다']})


>> df1 =    a  b
         0  a  1
         1  b  2
         2  c  3
         
>> df2 =    a  c
         0  a  가
         1  b  나
         2  d  다

위의 예시에서 df1 과 df2 를 살펴보면 a 컬럼이 공통적으로 있으므로, key 값으로 사용하여 Join을 할 수 있다. 조인을 할 때에는 merge() 을 사용하면 된다.

 

 

1. Outer Join : 합집합

두 DataFrame 에서 공통으로 존재하는 값은 그대로 채워넣고, 해당하는 값이 없다면 NaN이 자동으로 들어간다.

# outer
pd.merge(df1, df2, how='outer', on='a')

실행결과
	a	b	c
0	a	1.0	가
1	b	2.0	나
2	c	3.0	NaN
3	d	NaN	다

merge() 괄호 안에 df1, df2 는 각각 Join 시킬 DataFrame을 뜻하고, 'how= ' 는 how 뒤에 조인 타입을 입력하면 된다. 마지막으로 'on=' 은 어떠한 컬럼을 key 값으로 사용할지를 설정해주는 파라미터이다. 우리의 예시에서는 a컬럼을 사용할 것이므로 a를 입력한다.

 

2. Inner Join : 교집합

pd.merge(df1, df2, how = 'inner', on= 'a')

실행결과
	a	b	c
0	a	1	가
1	b	2	나

 

3. Left Join :  왼쪽 테이블에 있는 데이터 기준으로 오른쪽 데이터를 가져오는 방식

# left
pd.merge(df1, df2, how='left', on='a')

실행결과
	a	b	c
0	a	1	가
1	b	2	나
2	c	3	NaN

 

4. Right Join : 오른쪽 테이블에 있는 데이터 기준으로 왼쪽 데이터를 가져오는 방식

# right
pd.merge(df1, df2, how='right', on='a')


실행결과
a	b	c
0	a	1.0	가
1	b	2.0	나
2	d	NaN	다

 

우리가 살펴보았던 예시에서는 df1과 df2에 공통적으로 a 컬럼이 존재하였다. 따라서 key를 설정할 때 'on='  만을 사용하여

Join을 실행할 수 있었다.

 

하지만 실제로 DataFrame 을 merge 할 시에는 컬럼에 존재하는 값은 동일하나, 컬럼명이 다를 경우가 있는데 이럴 때에는

left에 존재하는 DataFrame과 right에 존재하는 DataFrame 중, key값으로 사용할 컬럼명을 지정해주어야 한다.

df1 = pd.DataFrame({'a' : ['a', 'b', 'c'],'b':[1, 2, 3]})
df2 = pd.DataFrame({'c' : ['a', 'b', 'd'],'d':['가', '나', '다']})

print(df1)
print()
print(df2)

df1
   a  b
0  a  1
1  b  2
2  c  3

df2
   c  d
0  a  가
1  b  나
2  d  다


pd.merge(df1, df2, how = 'inner', left_on= 'a', right_on='c')

실행결과
	a	b	c	d
0	a	1	a	가
1	b	2	b	나

위의 예시에서 a 컬럼과 c의 컬럼은 컬럼명은 다르지만 각 행이 가지는 값이 같으므로, 둘 중 하나의 컬럼을 삭제하여 사용하면 된다!