활연개랑

[pandas(팬더스)] DataFrame 합치기,병합 (concat, merge, join) 차이 (axis=0/ axis=1 차이) 본문

Python

[pandas(팬더스)] DataFrame 합치기,병합 (concat, merge, join) 차이 (axis=0/ axis=1 차이)

승해tmdhey 2021. 7. 15. 14:33
반응형

데이터 프레임을 합치는(병합하는) 함수로는 크게 세 가지가 있다. 

concat, merge, join으로 나뉘는데, 이 것들의 특징과 사용방법에 대해 알아보도록 하자.

 

concat

pd.concat()을 이용하여 Series나 DataFrame을 물리적으로 합칠 수 있다. 

 

예를 들기위해 sr1과 sr2를 만들어보자.

import pandas as pd
import numpy as np

col1= np.random.uniform(10,20,size=3) # 10~20 사이 실수 3개 
col2= np.random.uniform(10,20, size=3) 

sr1= pd.Series(col1,name='col1') #col1을 시리즈로 만들기
sr2= pd.Series(col2,name='col2') #col2를 시리즈로 만들기 

df=pd.concat([sr1,sr2], axis=1)

만든 sr1과 sr2는 

pd.concat([sr1,sr2], axis=1) 를 통해 데이터 프레임으로 합칠 수 있게된다.

axis= 1 은 열 방향으로 동작한다는 의미로 , 열방향으로 합쳐준다고 생각해주면 편합니다. 

(axis= 0 은 행 방향으로 동작한다는 의미로 작업 결과는 행으로 나타납니다.

 

위 코드에서는 axis=1로 설정했으므로 

아래와 같이 나타날 것입니다. 이것이 시리즈나 데이터프레임을 합치는 concat의 결과입니다. 

col1 col2
16.38 14.9
18.23 17.3
16.39 16.1 

 

 

merge

merge()를 이용한 결합을 알아보도록 합시다.

일단 merge함수를 사용하기 위해 두 개의 데이터 프레임을 만들어보도록 하겠습니다.

import numpy as np
import pandas as pd
data1 = np.arange(1,21).reshape(4,5)  #4행 5열로 1~20까지의 수를 넣겠다
data2 = np.arange(11,31).reshape(5,4)  # 5행 4열로 11~31까지의 수를 넣겠다

df1 = pd.DataFrame(data1, columns=list('abcde')) #df1이라는 데이터 프레임에 data1을 넣고 columns설정
df2 = pd.DataFrame(data2, columns=list('dehi')) #df2에 위와 같이 설정

merge()는 columns를 기준으로 병합이 됩니다. 

 

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

이렇게 설정하게되면, df1과 df2가 합집합으로 결합되게 됩니다. 

(how는 교집합/합집합을 설정하는 것이고 outer는 합집합/ inner는 교집합입니다. how를 입력하지 않으면

default는 inner로 설정되어 교집합으로 설정됩니다)

 

합집합일 경우, 4행5열인 df1의 5행에는 nan값이 들어가게 되겠죠? 

 

 

join

join()은 (columns를 기준으로 결합하는 merge()와 반대로) index를 기준으로 겹합하게 됩니다. 

또한 결합할 때 merge처럼 default가 교집합인 inner가 됩니다.

 

df1.join(df2,lsuffix='_1',rsuffix='_2') # <-- 교집합

df1을 df2와 조인하겠다는 의미로 위와 같은 코드를 사용하게됩니다.

lsuffix는 왼쪽 데이터프레임인 df1을 df2와 비교해주기 위해 컬럼에 '_1' 을 붙여 주겠다는 의미이고

rsuffix는 반대로 오른쪽 데이터프레임인 df2에 '_2'를 붙여주겠다는 의미입니다! 

결과는 위처럼 나옵니다!