[Python.Pandas] Merge 와 Concat 하여 데이터 붙이기

2020. 12. 29. 05:00Python과 머신러닝/Pandas 데이터 분석

0. 이전 포스트

 

[Python.Pandas] Pivot Table과 CrossTab 사용하기

1. Pandas의 PivotTable 함수 In [1]:import wget import pandas as pd import dateutil In [2]:url = 'https://www.shanelynn.ie/wp-content/uploads/2015/06/phone_data.csv' wget.download(url) 100% [..........

coding-grandpa.tistory.com

 

1. Merge 함수를 사용하여 데이터 합치기

In [1]:import pandas as pd
In [2]:raw_data = {'subject_id':['1','2','3','4','5','7','8','9','10','11'], 
                   'test_score':[51,15,15,61,16,14,15,1,61,16]} 
       df_a = pd.DataFrame(raw_data, 
                           columns=['subject_id', 'test_score']) 
       df_a
Out[2]:

Out[2]

In [3]:raw_data = {'subject_id':['4','5','6','7','8'], 
                   'first_name':['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 
                   'last_name' : ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}
       df_b = pd.DataFrame(raw_data, 
                           columns=['subject_id', 'first_name', 'last_name'])
       df_b
Out[3]:

Out[3]

In [4]:pd.merge(df_a, df_b, on='subject_id')
Out[4]:

Out[4]

  • 데이터 전처리 과정 중에 Merge와 Concat을 자주 사용하게 된다.
  • 예를 들어 지난달까지의 주식 정보를 관리하는 데이터 시트가 있고, 이번 달 데이터를 추가하려면 Merge를 통해서 합쳐줘야 할 것이다.
  • In[4]와 같이 df_a와 df_b를 합치게 되고, raw_data를 보면 알 수 있다시피 subject_id가 양쪽에 존재하는 경우의 데이터만을 출력하고 있다.
  • 이를 DB 용어로는 Inner Join이라고 하고, 따로 지정을 해주지 않고 merge 함수를 호출하면 Inner Join이 된다.

 

2. Left와 Right의 ID column 명이 다르다면?

In [5]:pd.merge(df_a, df_b, 
                left_on='subject_id', 
                right_on='subject_id') # left와 right의 Column 명이 다를 경우, 이 둘을 이어달라고 할 수 있음
Out[5]:

Out[5]

  • 현 예제에서는 left DataFrame과 right DataFrame의 Key가 되는 column의 이름이 subject_id로 동일하다.
  • 그렇기 때문에 merge(... on='subject_id') 형태로 입력하면 양쪽에서 subject_id를 비교해서 둘 다 존재하는 경우의 데이터만 추출하게 된다.
  • 만약 양쪽의 Key가 다른 Column 이름으로 들어가있다면, column이름을 바꿀 수도 있겠지만, In[5]와 같이 left_on/right_on을 각각 지정해주면, 각각의 변수를 읽어와서 서로 비교하는 동작을 한다.

 

3. Outer Join

In [6]:pd.merge(df_a, df_b, 
                on='subject_id', 
                how='outer')
Out[6]:

Out[6]

  • merge의 default는 Inner join(교집합)이다.
  • 그 외에 left/right/outer join도 할 수 있는데, 이를 지정하기 위해서는 how='outer'과 같이 사용하면 된다.
  • outer join은 합집합이기 때문에, 결측치가 있어도 전부 보여지는 것을 Out[6]에서 확인할 수 있다.

 

4. Concat을 통해 데이터 합치기

In [7]:raw_data = {'subject_id':['1','2','3','4','5'], 
                   'first_name':['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'], 
                   'last_name':['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']} 
       df_a = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name']) 
       df_a
Out[7]:

Out[7]

In [8]:raw_data = {'subject_id':['4','5','6','7','8'], 
                   'first_name':['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 
                   'last_name':['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']} 
       df_b = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name']) 
       df_b
Out[8]:

Out[8]

  • Merge는 DB의 Join과 같았다면, Concat은 보다 단순한 붙이기에 가깝다.

 

5. 데이터 Row 추가하기

In [9]:pd.concat([df_a, df_b]) # 밑으로 붙이기
Out[9]:

Out[9]

  • concat 함수에 붙이고자 하는 데이터를 list형태로 제공하면,
  • Out[9]와 같이 데이터가 위아래로 붙어 있는 것을 확인할 수 있다.

 

6. 데이터 Column/Series 추가하기

In [10]:pd.concat([df_a, df_b], axis=1)
Out[10]:

Out[10]

  • Concat에 axis를 지정해주면, 원하는 axis를 기준으로 추가가 된다.
  • default 가 axis=0이기 때문에, row가 추가된다.
  • column을 추가하고 싶다면, axis=1을 명시해주어야 한다.

 

7. 관련 포스트

 

[Python.Pandas] String 관련 함수 총정리 (str.upper, .replace, .isdigit, .contains, .match, .split, .rename, .get_dummies)

1. str.upper() : 대문자로 변경하라 In [1]:import pandas as pd In [2]:raw_data = {'subject_id':['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], 'first_name':['Alex', 'Amy', 'Allen', 'Alice', 'Ayo..

coding-grandpa.tistory.com