본문 바로가기
  • 문과생의 백엔드 개발자 성장기
|Playdata_study/Python

210723_Concat,Merge

by 케리's 2021. 7. 24.

DataFrame - 데이터 병합

 

  • Concat

    단순히 하나의 DataFrame에 다른 DataFrame 을 연속적으로 붙이는 방법
    이 경우에는 두 DataFrame 이 서로 동일한 인덱스, 컬럼을 가지고 있는 경우가 대부분이다.
    위, 아래로 연결되는 방식이 기본이지만 좌, 우 연결도 가능하다.
    outer join이 기본으로 동작
    key를 이용한 Concat 활용해서 사용한다.

 

  • Merge

    두 개의 DataFrame을 병합.
    좌, 우로 연결되는 방식이 기본.
    inner join이 기본으로 동작
    on을 이용해 Merge 활용해서 사용한다.

 

 

pandas 의 concat

 

import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt

 

 

df1 = DataFrame({
    'A':['A0','A1','A2','A3'],
    'B':['B0','B1','B2','B3'],
    'C':['C0','C1','C2','C3'],
    'D':['D0','D1','D2','D3'],
    
    })
df1

 

 

df2 = pd.DataFrame({
    'A':['A4', 'A5', 'A6', 'A7'],
    'B':['B4', 'B5', 'B6', 'B7'],
    'C':['C4', 'C5', 'C6', 'C7'],
    'D':['D4', 'D5', 'D6', 'D7'],
    })
df2

 

 

# concat ([]) : 위 DataFrame 을 합쳐보자 

 

'''
df1, df2 데이터를 가만히 보자
어떻게 병합하는게 좋을까?
--> 상하 연결
--> pandas 에서 제공하는 함수 concat()

:: 결과를 확인하면 
인덱스가 0,1,2,3,0,1,2,3 
동일한 인덱스 값이 그대로 반복되어져 있다.
ignore_index = True 옵션을 지정한다.

'''

result1 = pd.concat([df1,df2])
result1

 

 

# 좌우병합 : axis = 1

# 컬럼명 인덱스로 대체 : ignore_index = True 

 

# 좌우 병합은? axis = 1
# ignore_index = True 지정, 해당 컬럼명이 인덱스로 대체된다.

result1 = pd.concat([df1, df2], axis = 1, ignore_index=True) # 행이아닌 열로 합쳐진다
result1

 

 

result1 = pd.concat([df1, df2], axis = 1) # 행이아닌 열로 합쳐진다
result1

 

 

 

# Keys

 

result1 = pd.concat([df1,df2], keys=['X','Y'])
result1

 

 

df3 = DataFrame({
    'A':['A0','A1','A2','A3'],
    'B':['B0','B1','B2','B3'],
    'C':['C0','C1','C2','C3']      
})
df3

 

df4 = pd.DataFrame({
    'A':['A4', 'A5', 'A6', 'A7'],
    'B':['B4', 'B5', 'B6', 'B7'],
    'C':['C4', 'C5', 'C6', 'C7'],
    'D':['D4', 'D5', 'D6', 'D7'],
})
df4

 

 

 

# outerjoin

: join 시 없는 데이터에 누락데이터를 만들어서 병합

 

'''
위 df3, df4 데이터는 행과 열 인덱스가 일치하지 않는 데이터 프레임이다.
axis = 0 을 기준으로 병합 하기 때문에 concat은 상하로 데이터를 이어 붙이게 될 것이다.
어떤 현상이 발생할까?

join시 없는 데이터에 
누락데이터가 만들어서 병합된다 = outerjoin

'''

result2 = pd.concat([df3, df4], ignore_index=True) # join= 'outer' 가 디폴트
result2

 

 

 

 

# innerjoin

: join 시 둘다 가지고 있는 컬럼값 (행 인덱스) 만 가져온다 

 

 

result3 = pd.concat([df3, df4], ignore_index=True, join='inner')
result3 # 둘다 가지고 있는 컬럼값(행 인덱스)만 가져온다 = innerjoin

 

 

Pandas 의 Merge

 

 

'''
df1, df2 는 인덱스만 다를 뿐 모든 값을 동일하게 가지고 있다.
df3 Color_num 이라는 다른컬럼을 모두 가지고 있다.

'''

df1 = DataFrame({ 'Year':[2001,2002,2003,2004],
                  'Product_Code':[11,22,33,44],
                  'Price':[10000,20000,30000,40000]},
                   index=list('1234'))
df1

df2 = DataFrame({ 'Year':[2001,2002,2003,2004],
                  'Product_Code':[11,22,33,44],
                  'Price':[10000,20000,30000,40000]},
                   index=list('5678'))
df2

df3 = DataFrame({ 'Year':[2001,2003,2004,2005],
                  'Product_Code':[11,22,33,44],
                  'Color_num':[33,44,55,99]},
                   index=list('1234'))
df3

df1,       df2,       df3

 

 

# df1, df2 를 merge 

 

# df1, df2 를 merge 
# 1.표현법이 concat과 다르다, [] 들어가지 않는다
# 2.인덱스와 상관없이 병합되고 (+좌우병합) 값 들은 중복 표기되지 않는다. (동일하다면)

result1 = pd.merge(df1,df2)
result1

 

 

 

# df1_1 과 df1을  merge

 

# df1_1 과 df1을  merge

df1_1 = DataFrame({ 'Year':[2001,2002,2003,2004],
                  'Product_Code':[11,22,33,44],
                  'Price':[1,2,3,4]},
                   index=list('1234'))
result2 = pd.merge(df1,df1_1)
result2 # 결과가 나오지 않는다, 그렇기 때문에 'on'을 사용해야한다.

# merge 할때는 주로 특정한 컬럼을 기준으로 병합을 한다.
# 기준이 되는 컬럼 외에는 다 중복으로 데이터가 표기된다.
# on : 병합할 때 기준이 되는 컬럼을 지정
result2 = pd.merge(df1,df1_1, on = 'Year')
result2

 

 

result3 = pd.merge(df1, df1_1, on = ['Year','Product_Code'])
result3

 

 

 

 

set_index()

 

특정한 컬럼을 인덱스로 지정함으로써
데이터 프레임을 좀 더 깔끔하고 직관적으로 디스플레이 할 수 있다.

 

 

result3.set_index('Year', inplace=True)
result3

 

 


 

 

# 문제1  df1 과 df3 을 merge 

 

 

 

 

 

 

 

# Year를 기준으로 병합

 

# Year를 기준으로 병합

result3 = pd.merge(df1, df3, on = 'Year')
result3

 

 

 

 

 

# how = 'outer'

 

# how 옵션이 있다. 어떻게 merge할 것인가? join과 동일한 옵션
# 여기서 inner가 디폴트이다.

result4 = pd.merge(df1, df3, on = 'Year', how = 'outer')
result4

 

 

 

result5 = pd.merge(df1, df3, on = 'Year', how = 'inner') # 디폴트
result5

 

 

result6 = pd.merge(df1, df3, on = 'Year', how = 'left') # df1 컬럼위주로 병합
result6

 

 

 

result7 = pd.merge(df1, df3, on = 'Year', how = 'right') # df3 컬럼위주로 병합
result7

'|Playdata_study > Python' 카테고리의 다른 글

210726_Pivot Tables 2  (0) 2021.07.26
210723_GroupBy, Pivot Tables  (0) 2021.07.24
210722_NaN (누락데이터)  (0) 2021.07.23
210722_Pandas (DataFrame)  (0) 2021.07.23
210721_Pandas(Series, Matplot)  (0) 2021.07.23

댓글