본문 바로가기
데이터 분석/데이터 전처리

[Pandas] 9. 데이터 결합(Join)하기

by 부자 꽁냥이 2020. 9. 13.

안녕하세요~~ 꽁냥이에요!!

 

데이터 분석을 하다 보면 두 개 이상의 데이터를 다루어야 할 때가 많은데요. 두 데이터에 공통으로 포함하지 않은 열(Column)이 있을 때에는 이를 합쳐서 보고 싶을 거예요. 왜냐하면 두 데이터를 결합하여 하나의 데이터로 만들어주어야 데이터 분석이 더 용이해질 테니까요.

 

이번 포스팅에서는 Pandas 데이터 프래임들을 결합하는 방법에 대해서 소개하려고 합니다.

 

1. 세로로 결합하기

2. 가로로 결합하기


   1. 세로로 결합하기

세로로 결합한다는 뜻은 행과 행이 더해진다는 뜻이에요. 아래 그림처럼 말이죠.

 

 

먼저 세로로 결합하기 위한 데이터를 준비해볼게요. 

 

import pandas as pd

## 데이터 준비
data1 = {
    'A':['apple','banana'],
    'B':[1,3],
    'C':['good','bad']
}
df1 = pd.DataFrame(data1)

data2 = {
    'A':['pear'],
    'B':[2],
    'C':['not bad'],
    'D':['Korea']
}
df2 = pd.DataFrame(data2)

 

Pandas에서는 두 데이터를 세로로 결합하기 위하여 append 함수와 concat 함수를 제공하고 있어요.

1. append 함수를 이용하여 결합하기

## 세로로 결합하기 append 사용
df = df1.append(df2)

 

line 2

첫 번째 데이터프래임에서 append 함수를 불러와 결합하고자 하는 두 번째 데이터를 인자로 넣어줍니다.

 

df에는 어떤 데이터가 들어가 있을까요?

 

 

출력을 해보면 위 그림과 같이 세로로 결합된 것을 알 수 있습니다. 이때 첫 번째 데이터프래임에는 'D'열이 없기 때문에 첫 번째 데이터프래임 개수만큼 NaN 값이 채워져 있음을 주목하세요.

2. concat 함수를 이용하여 결합하기

## 세로로 결합하기 concat 사용
df = pd.concat([df1,df2])

line 2

concat 함수 인자에 결합할 데이터들을 리스트에 담아서 넘겨주시면 됩니다.

 

df에 담긴 데이터는 앞서 본 것과 동일합니다.

 

꽁냥이는 append 함수보다 concat 함수를 사용하여 데이터 결합하는 것을 추천드려요. 왜냐하면 concat 함수는 3개 이상의 데이터도 결합할 수 있기 때문이에요.

 

아래 예제 코드를 통해 concat 함수는 3개 이상의 데이터도 결합할 수 있음을 확인하세요.

 

import pandas as pd

data1 = {
    'A':['apple','banana'],
    'B':[1,3],
    'C':['good','bad']
}
df1 = pd.DataFrame(data1)

data2 = {
    'A':['pear'],
    'B':[2],
    'C':['not bad'],
    'D':['Korea']
}
df2 = pd.DataFrame(data2)

data3 = {
    'A':['orange'],
    'B':[2],
    'C':['so so'],
    'D':['China']
}
df3 = pd.DataFrame(data3)

## 세로로 결합하기 concat 함수 사용
df = pd.concat([df1,df2,df3])
반응형

   2. 가로로 결합하기

가로로 데이터를 결합한다는 뜻은 열과 열이 합쳐진다는 거예요. 아래 그림처럼 말이죠.

 

 

먼저 가로로 결합하기 위한 데이터를 준비할게요.

 

import pandas as pd

data1 = {
    'A':['apple','banana'],
    'B':[1,3],
}
df1 = pd.DataFrame(data1)

data2 = {
    'C':['good','so so','bad'],
    'D':['Korea','America','China']
}
df2 = pd.DataFrame(data2)

 

Pandas에서는 데이터를 가로로 결합하기 위하여 concat 함수와 merge 함수를 제공하고 있어요.

1. concat 함수를 이용하여 결합하기

## 가로로 결합하기 concat 사용
df = pd.concat([df1,df2],axis=1)

 

line 2

concat 사용법은 세로로 결합할 때와 비슷합니다. 다만 axis 인자에 1을 넣어 주어야 한다는 차이점이 있지요.

 

 

df를 출력해보시면 가로로 결합된 것을 확인할 수 있습니다. 여기서 첫 번째 데이터는 두 번째 데이터보다 개수가 한 개 적어서 적은 수만큼 NaN으로 채워졌습니다.

 

concat 함수는 세 개 이상의 데이터도 가로로 결합할 수 있습니다. 하지만 concat 함수는 열과의 관계는 고려하지 않고 그냥 옆으로 붙여나가는 방식입니다. 따라서 두 데이터가 공통적으로 가지고 있는 열을 가지고 join을 할 수 없다는 단점이 있습니다. SQL에서 자주 사용하는 join을 하고 싶다면 merge 함수를 이용해야 합니다.

2. merge 함수를 이용하여 결합하기

먼저 공통된 열을 갖고 있는 두 데이터를 만들어볼게요.

 

import pandas as pd

data1 = {
    'A':['apple','banana','pear'],
    'B':[1,3,4],
}
df1 = pd.DataFrame(data1)

data2 = {
    'A':['apple','banana','orange'],
    'C':['good','bad','not bad']
}
df2 = pd.DataFrame(data2)

 

두 데이터에는 'A'열을 공통적으로 갖고 있어요.

 

join 방식에는 'left', 'right', 'inner', 'outer' 총 4개의 방식이 있으며 각각 left join, right join, inner join, outer join을 의미합니다. 아래 그림은 각 join 방식의 개념을 도식화한 것입니다.

 

 

 join 방식은 merge 함수 안의 how 인자에 넣어 주셔야 해요. 각 방식에 대해서 하나씩 살펴볼게요. 

(1) 'inner'

이 방식은 공통된 열에 대하여 두 데이터 공통적으로 갖고 있는 값을 결합합니다(교집합).

 

df = pd.merge(df1,df2,how='inner',on=['A'])

 

두 데이터의 공통된 열은 on 인자에 리스트로 넘겨주셔야 해요.

 

 

두 데이터에서 'A'열에 공통적으로 있는 데이터는 'apple'과 'banana'이기 때문에 이 두 개의 데이터만 결합된 것을 알 수 있습니다.

(2) 'outer'

이 방식은 공통된 열에 대하여 두 데이터가 가지고 있는 모든 값을 결합합니다(합집합).

 

df = pd.merge(df1,df2,how='outer',on=['A'])

 

 

보시는 바와 같이 'A'열에 대하여 두 데이터가 갖고 있는 모든 값이 합쳐져 있습니다. 'A'열에 대응하는 값이 없다면 NaN로 채워집니다.

(3) 'left'

이 방식은 왼쪽 데이터, 여기서는 df1을 기준으로 공통된 열 'A'에 대응하는 df2의 데이터가 합쳐지게 됩니다.

 

df = pd.merge(df1,df2,how='left',on=['A'])

 

 

보시는 바와 같이 df1에 있는 'A'열을 기준으로 df2가 합쳐지게 됩니다. 또한 'A'열에 대응하는 데이터가 df2에 없다면 NaN값이 채워지게 됩니다.

(4) right 

이 방식은 'left'와 반대인데요. 오른쪽 데이터, 여기서는 df2를 기준으로 공통된 열 'A'에 대응하는 df2의 데이터가 합쳐지게 됩니다.

 

df = pd.merge(df1,df2,how='right',on=['A'])

 

 

보시는 바와 같이 오른쪽 데이터인 df2를 기준으로 df1이 합쳐지게 됩니다. 또한 'A'열에 대응하는 데이터가 df1에 없다면 NaN값이 채워지게 됩니다.

 

이번 포스팅에서는 데이터를 결합하는 방법에 대해서 알아보았습니다. 궁금한 점, 잘못된 점, 하고 싶은 말은 댓글로 남겨주세요.

 

지금까지 꽁냥이의 글 읽어주셔서 감사합니다.


댓글


맨 위로