데이터/데이터 분석

파이썬 판다스 (concat / merge)

Jerry_K 2024. 3. 26. 09:15

📚  pandas concat / merge 함수

concat과 merge는 데이터 프레임들을

결합 할 때 자주 쓰는 판다스 함수이다. 

 

매번 쓸 때마다 기억이 않나서 찾아본다...

이번에 최대한 깔끔하게 정리해서, 

개념을 좀 더 확실히 해보려고 한다. 


 

먼저 concat과 merge의 사전적 정의를 살펴보자

 

concatenate :  사슬같이 잇다, 연결시키다

merge : 합병하다, 병합하다, (서로 구분이 안되게) 어우러지다

 

두개 다 데이터 프레임을 합치는 것은 맞지만,

concat은 주로 연결 시키는데 사용하고

merge합쳐서 어우러지게  한다고 생각하면 좋을 것 같다. 

 

이제 예시를 한번 살펴보자.


💡 pd.concat

import numpy as np
import pandas as pd
np.random.seed(42)
columns = ["A","B","C","D","E"]
df1 = pd.DataFrame(np.random.randint(1,100,(10,5)), columns=columns)
df2 = pd.DataFrame(np.random.randint(1,100,(4,5)), columns=columns)

 

먼저 간단하게 concat 할 데이터 프레임을 만든다. 

 

 

pd.concat([df1,df2],axis=0)

 

concat의 하이퍼 파라미터 axis를 먼저 살펴보자.

axis=0은 행의 개수가 변한다는 것을 의미한다.

위에 concat은 axis=0으로 했기 때문에 행 방향으로 연결된다,

 

 

pd.concat([df1,df2],axis=1)

 

그럼 당연히 axis=1은 열의 개수가 바뀌는 방향으로 간다.

 

 

df2.drop("E",axis=1,inplace=True)
pd.concat([df1,df2],join="inner")

이번에는 df2의 E 컬럼을 지워보고, join 파라미터를 사용해보자.

 

"inner"  는 교집합을 생각하면 된다.  

교집합만 출력하기 때문에 E는 제외하고 출력한다.

 

 

pd.concat([df1,df2],join="outer")

반대로 "outer"은 합집합을 의미한다.

df2 컬럼에 "E" 가 없지만, 교집합이기 때문에

모든 컬럼이 출력된다.

 


💡  pd.merge

 

grades_data = {
    '학번': [1, 2, 3, 4, 5],
    '이름': ['철수', '영희', '민수', '수진', '미영'],
    '과학': [90, 85, 88, 92, 95],
    '수학': [85, 88, 92, 78, 90]
}
grades_df = pd.DataFrame(grades_data)

info_data = {
    '학번': [1, 2, 3, 4, 6],
    '성별': ['남', '여', '남', '여', '여'],
    '학년': [3, 3, 2, 1, 3]
}
info_df = pd.DataFrame(info_data)

 

merge 연습을 위한 데이터 셋을 만들었다.

 

 

1. Left Join

pd.merge(left=grades_df,right=info_df,on="학번",how="left")

 

left, right는 각각 grades_df / info_df 으로,

merge 기준열은  "학번",

join 방식은 left로 왼쪽 열을 기준으로 병합된다.

 

따라서 grades_df (왼쪽)은 모두 출력이 되고,

info_df   (오른쪽)은  "학번" 기준으로 왼쪽에 해당되는 것만 병합된다.

 

 

2. Right Join

pd.merge(left=grades_df,right=info_df,on="학번",how="right")

 

left join와 방식이 거의 똑같다. 

다만, join 방식을 right 기준으로 한 것이다.

 

따라서 info_df (오른쪽) 에 있는 데이터는 모두 출력되고,

grades_df (왼쪽)은  "학번" 기준으로 오른쪽에 해당되는 것만 병합된다.

 

3. Inner Join

pd.merge(left=grades_df,right=info_df,on="학번",how="inner")

 

inner join 같은 경우에는, 양쪽에 공통으로 있는 값만 나타낸다.

위에 출력 된 값들을 보면  학번 5와 6이 출력되지 않은 것을 알 수 있다.

 

4. Outer Join

pd.merge(left=grades_df,right=info_df,on="학번",how="outer")

 

inner join 이 있으니 당연히 outer join도 있을 것이다.

outer join은 모든 값을 다 나타나도록 한다. 

없는 값들은 NaN 값으로 한다.

 


📝마무리

데이터셋을 합치려 할 때, merge와 concat을 항상 까먹는다.

그때마다 복잡하고 어렵다는 생각이 들고는 하는데, 

사실 이것보다 쉬운것도 없다 ...