ᐧ༚̮ᐧ Data Science | AI/Python

[파이썬 Pandas] 데이터프레임 병합 merge 가이드

Letter_B 2024. 11. 9. 11:12
728x90
반응형

 

데이터 분석에서는 여러 테이블에 분산된 정보를 하나로 모으는 작업을 자주 하게 된다. pandas 라이브러리의 merge 함수는 SQL 스타일의 조인으로 여러 데이터프레임을 다양한 조인 방식(inner, outer, left, right)을 지원한다.

 

SQL 조인 종류

 

 

 

이번 글에서는 두 개의 영화 데이터프레임을 사용해 merge() 예제를 살펴보겠습니다.

첫 번째 데이터프레임은 영화의 ID, 제목, 장르 정보를 담고 있고, 두 번째 데이터프레임은 영화 ID와 사용자 평점을 포함하고 있다.

 

import pandas as pd

df_movies = pd.DataFrame({
    'MovieID': [1, 2, 3, 4],
    'Title': ['어벤져스', '겨울왕국', '아바타', '괴물'],
    'Genre': ['액션', '애니메이션', 'SF', '스릴러']
})

df_ratings = pd.DataFrame({
    'MovieID': [2, 3, 3, 4, 6],
    'UserRating': [4.5, 4.7, 4.8, 4.2, 4.9]
})

 

 

예제

 

 

 


inner join 교집합

두 데이터프레임의 기준 열에서 공통으로 존재하는 값만 남기고 병합한다 여기서 기준 열은 두 데이터프레임에서 데이터를 연결할 때 기준이 되는 열(column)을 의미한다. 두 데이터프레임에 공통으로 포함된 열의 이름을 pd.merge() 함수에서 on="" 옵션에서 지정해 준다.

 

 

예를 들어 우리의 예제에서는 기준 열이 MovieID라고 가정을 했을 때, df_movies의 MovieID 열 값은 [1, 2, 3, 4]이고 df_ratings의 MovieID 열 값은 [2, 3, 3, 4]이다. Inner join을 수행할 때 [2, 3, 4]인 행만 두 데이터프레임에 공통적으로 존재하기 때문에 이 값들만 결합된다.

 

 

 

 

inner_join = pd.merge(df_movies, df_ratings, on='MovieID', how='inner')

 

 

 

outer join 합집합

outer join은 두 데이터프레임을 병합할 때, 두 데이터프레임에 있는 모든 기준 열의 값을 포함하여 결합하는 방식이다. 한쪽 데이터프레임에만 있는 값도 결과에 포함된다. 한쪽에만 있는 값에 해당하는 데이터는 NaN으로 채워진다.

 

pd.merge() 함수에서 how="outer"로 지정하여 outer merge를 수행한다.

 

만약 두 데이터프레임들이 동일한 열 이름이 없고 이름이 다르다면 left_on과 right_on을 사용해서 병합가능하다. (예를 들어, 한 데이터프레임은 MovieID인 반면 다른 데이터프레임은 ID일 경우: pd.merge(df1, df2, left_on="MovieID", right_on="ID", how="outer")

 

outer_join = pd.merge(df_movies, df_ratings, on='MovieID', how='outer')

 

 

 

 

 

 

left join 왼쪽 조인

left join은 왼쪽 데이터프레임의 모든 데이터를 포함하고, 오른쪽 데이터프레임에서 일치하는 데이터를 합침.

 

왼쪽 데이터프레임에 있는 모든 행이 결과 데이터에 포함된다.

왼쪽 데이터프레임에만 있는 데이터는 포함되지만, 오른쪽 데이터프레임에만 있는 데이터는 포함되지 않는다 (NaN으로 표시)

 

left_join_result = pd.merge(df_movies, df_ratings, on="MovieID", how="left")

 

 

 

 

 

 

right join 오른쪽 조인

 

right join은 오른쪽 데이터프레임의 모든 데이터를 포함하고, 왼쪽 데이터프레임에서 일치하는 데이터를 합침.

 

 

 

 

 

right_join_result = pd.merge(df_movies, df_ratings, on="MovieID", how="right")

 

 

728x90
반응형