EDA with Pandas - Data Merge

Page content

강의 홍보

I. 개요

  • 실무 데이터에서는 여러가지 데이터를 만나는 경우가 흔하다.
  • 이 때, SQL에서 데이터를 직접 병합하는 방법이 좋다.
  • 그러나, 현실적으로 DB에 접근하는 권한을 가진 경우는 흔하지는 않다. 현재 운영중인 서비스상에 DB를 직접 만지는 경우는 거의 없다 (DBA가 할지도..)
  • 따라서, 데이터분석가는 흩어져 있는 데이터 Dump를 받게 될 가능성이 큰데, 이 때 Python에서 데이터를 병합하는 작업을 진행하게 된다.
  • Kaggle이나 각종 경진대회에 출전하게 되면 서로 다른 데이터를 합쳐야 하는 경우가 매우 많다.

II. 모듈 Import

import pandas as pd
print(pd.__version__)
1.0.4
  • 데이터프레임을 보다 이쁘게 출력하기 위해 다음 2개의 패키지를 불러온다.
from IPython.core.display import display, HTML
from tabulate import tabulate

III. Pandas 데이터 병합 Sample Tutorial

  • 간단하게 데이터를 병합하는 방법에 대해 실습을 진행한다.

(1) 파라미터 세팅

  • 먼저, 행과 열을 최대 출력하는 개수를 지정한다.
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_rows', 500)

(2) 데이터 생성

  • 먼저 가상의 데이터를 두개 만든다.
temp_1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 
                       'num1': [1,2,3,4]})
print(tabulate(temp_1, headers=['key', 'num'], tablefmt='pipe'))
|    | key   |   num |
|---:|:------|------:|
|  0 | A     |     1 |
|  1 | B     |     2 |
|  2 | C     |     3 |
|  3 | D     |     4 |
temp_2 = pd.DataFrame({'key': ['A', 'B', 'E', 'F'], 
                       'num2': [5,6,7,8]})
print(tabulate(temp_2, headers=['key', 'num'], tablefmt='pipe'))
|    | key   |   num |
|---:|:------|------:|
|  0 | A     |     5 |
|  1 | B     |     6 |
|  2 | E     |     7 |
|  3 | F     |     8 |

(3) Data Merge - inner join

  • key값을 근거로 데이터를 병합한다.
  • 이 때, merge의 형태는 inner join 형태로 출력된다.
merge_df = pd.merge(temp_1, temp_2, on='key')
print(tabulate(merge_df, headers=['key', 'num1', 'num2'], tablefmt='pipe'))
|    | key   |   num1 |   num2 |
|---:|:------|-------:|-------:|
|  0 | A     |      1 |      5 |
|  1 | B     |      2 |      6 |
inner_df = pd.merge(temp_1, temp_2, on='key', how='inner')
print(tabulate(inner_df, headers=['key', 'num1', 'num2'], tablefmt='pipe'))
|    | key   |   num1 |   num2 |
|---:|:------|-------:|-------:|
|  0 | A     |      1 |      5 |
|  1 | B     |      2 |      6 |
  • 위 두개의 결과값이 똑같음을 확인할 수 있다.

(4) Data Merge - outer join

  • 이번에는 outer join을 해보자.
outer_df = pd.merge(temp_1, temp_2, on='key', how='outer')
print(tabulate(outer_df, headers=['key', 'num1', 'num2'], tablefmt='pipe'))
|    | key   |   num1 |   num2 |
|---:|:------|-------:|-------:|
|  0 | A     |      1 |      5 |
|  1 | B     |      2 |      6 |
|  2 | C     |      3 |    nan |
|  3 | D     |      4 |    nan |
|  4 | E     |    nan |      7 |
|  5 | F     |    nan |      8 |
  • 결과값을 보면, 우선 key값은 모두 출력되었다.
  • 이 때, 각 데이터에서 가져오는 num1num2Column도 같이 들어오는데, 각 column마다 없는 값들은 이렇게 nan으로 조회됨을 확인할 수 있다.

(5) Assignment

  • 이제 수강생 분들이 left & right 조인을 해보도록 한다.
  • 공식문서를 보면서 코드 작성하는 것을 추천한다.
# pd.merge(temp_1, temp_2) 여기 코드에서 남은 코드를 작성하면 됩니다. 
right_df = pd.merge(temp_1, temp_2, on='key', how='left')
print(tabulate(right_df, headers=['key', 'num1', 'num2'], tablefmt='pipe'))
|    | key   |   num1 |   num2 |
|---:|:------|-------:|-------:|
|  0 | A     |      1 |      5 |
|  1 | B     |      2 |      6 |
|  2 | E     |    nan |      7 |
|  3 | F     |    nan |      8 |
  • 그리고 이번에는 left join을 해본다.
# pd.merge(temp_1, temp_2) 여기 코드에서 남은 코드를 작성하면 됩니다. 
right_df = pd.merge(temp_1, temp_2, on='key', how='left')
print(tabulate(right_df, headers=['key', 'num1', 'num2'], tablefmt='pipe'))
|    | key   |   num1 |   num2 |
|---:|:------|-------:|-------:|
|  0 | A     |      1 |      5 |
|  1 | B     |      2 |      6 |
|  2 | C     |      3 |    nan |
|  3 | D     |      4 |    nan |

VI. What’s next

  • 데이터를 병합하는 방법 중 Merge에 대해서 배웠다.
  • Merge에는 크게 4가지 방법이 있고, 방법에 따라서 최종 데이터의 출력값이 서로 다름을 확인하였다.
  • 다음 시간에는 또다른 병합 방법인 Concatenate에 학습하도록 한다.