ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] 데이터프레임 합치기 조인 병합 :: pd.merge (join)
    직접 해보기/Python 2024. 6. 20. 16:37
    728x90
    반응형

    0️⃣  데이터프레임 생성

    • 예시가 될 데이터프레임 2개를 먼저 만들어 볼게요.
    import pandas as pd
    import numpy as np
    
    # 병합할 데이터프레임 2개 생성
    df_customer = pd.DataFrame({
        'customer_id' : [1, 2, 3, 4, 5],
        'name' : ['Kim', 'Lee', 'Park', 'Choi', 'Yoon'],
        'grade' : ['Silver', 'Gold', 'Gold', 'Silver', 'Platinum']
    })
    df_orders = pd.DataFrame({
        'customer_id' : [1, 2, 2, 2, 3, 3, 5, 5, 5, 10],
        'item_order' : ['pumpkin', 'potato', 'garlic', 'carrot', 'cabbage', 'pumpkin', 'potato', 'corn', 'pepper', 'onion'],
        'quantity' : [2, 5, 10, 4, 2, 1, 4, 3, 6, 8]
    })


    1️⃣  교집합으로 합치기 (Inner Join)

    • merge 메소드는 SQL JOIN 에서 문법을 가져온 메소드라는 게 눈에 보이죠. 아래와 같이 요소들을 지정해줘야 합니다.
      pd.merge(왼쪽에 위치할 df, 오른쪽에 위치할 df, on = '조인 기준이 되는 칼럼명', how = '조인 방식')
    • merge 메소드의 디폴트값이 how = 'inner' 이기 때문에, Inner Join을 하고 싶다면 아무것도 지정하지 않아도 됩니다.

    • Inner Join = 교집합 방식 = 한쪽에 없는 칼럼이면 제외하고 공통으로 존재하는 칼럼만 남기는 방식입니다.
      따라서 아래처럼 df_customer에만 있는 4번 고객, df_orders에만 있는 10번 고객의 구매아이템은 제외된 모습입니다.
    # Inner Join 방식으로 병합하기
    pd.merge(df_customer, df_orders, on = 'customer_id')


    2️⃣  합집합으로 합치기 (Outer Join)

    • Outer Join = 합집합 방식 = 한쪽에 없는 칼럼이어도 전부 포함해서 합치는 방식입니다.
    • 따라서 아래처럼 df_customer에만 있는 4번 고객, df_orders에만 있는 10번 고객의 구매아이템도 전부 포함되었습니다.
      이에 따라 없던 셀도 생기면서 NaN값이 되었습니다. 결측치 처리된거죠.


    2️⃣  왼쪽 or 오른쪽 데이터프레임 기준으로 합치기 (Left Join, Right Join)

    • Left Join : 왼쪽 데이터프레임에 있는 건 전부 가져옵니다. 왼쪽에 없는데 오른쪽에만 존재하는 데이터는 제외합니다.
      아래 예시를 보시면, df_cutomer에만 있는 4번 고객이 포함되어 있죠.
    • Right Join : 위와 반대입니다. 오른쪽 데이터프레임에 있는 건 전부 가져오고, 왼쪽에만 존재하는 건 제외합니다.
      마찬가지로 df_orders에만 존재하는 10번 고객의 구매아이템이 포함되어 있습니다.
    # Left Join 방식으로 병합하기
    pd.merge(df_customer, df_orders, on = 'customer_id', how = 'left')
    
    # Right Join 방식으로 병합하기
    pd.merge(df_customer, df_orders, on = 'customer_id', how = 'right')


    *️⃣  인덱스를 기준으로 합치고 싶을 때

    • 아래처럼, 두 데이터프레임의 인덱스를 기준으로 조인을 시킬 수도 있습니다.
    • 이 경우 이미 인덱스를 기준으로 한다는 파라미터가 들어가므로, 파라미터 on 은 필요 없습니다.
      파라미터 how를 추가해서 outer, left, right 등 조인 방식을 바꿀 수 있습니다.
    # 두 인덱스를 기준으로 지정 → Inner Join과 동일
    pd.merge(df_customer, df_orders, left_index = True, right_index = True)


     

     

    728x90
    반응형