ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] 데이터프레임 합치기 병합하기 :: pd.concat
    직접 해보기/Python 2024. 6. 20. 15:36
    728x90
    반응형

    0️⃣  데이터프레임 생성

    • 예시가 될 데이터프레임 2개를 먼저 만들어 볼게요.
    import pandas as pd
    import numpy as np
    
    # 병합할 데이터프레임 2개 생성
    df_1 = pd.DataFrame({
        'product' : ['onion', 'carrot', 'cabbage', 'pumpkin', 'potato'],
        'amount' : [100, 50, 70, 30, 80] 
    })
    df_2 = pd.DataFrame({
        'product' : ['pumpkin', 'potato', 'garlic', 'corn', 'pepper'],
        'amount' : [20, 60, 90, 80, 50]
    }, index = [3,4,5,6,7])


    1️⃣  칼럼 이름이 동일한 데이터프레임끼리 합치는 경우

    1️⃣-1.  행 레벨로 합치기 (기본값, axis=0)

    • 두 데이터프레임을 행 레벨로 = 위아래로 붙이고 싶은 경우 파라미터를 지정하지 않아도 됩니다. axis=0 이 디폴트값이거든요.
    • 다만 이렇게 병합하면 인덱스도 원래것 그대로 붙습니다. 인덱스 초기화가 필요하다면 ignore_index = True 를 추가해주세요.
    • 혹시 몇천 몇만행짜리 데이터프레임을 합쳐야 하는데, 인덱스가 중복되는지 확인하고 싶은 경우라면
      파라미터 verify_integrity = True 를 추가하세요. 중복된다면 에러가 뜨도록 해주는 파라미터입니다.
    # 기존 인덱스들을 유지하면서 병합 (디폴트)
    pd.concat([df_1, df_2])
    
    # 병합하면서 인덱스 초기화
    pd.concat([df_1, df_2], ignore_index = True)

     

    1️⃣-2.  칼럼(열) 레벨로 합치기 (axis=1)

    • 두 데이터프레임을 열 레벨로 = 옆으로 붙이고 싶다면 axis=1 로 지정해줘야 합니다.
    • 아래처럼 인덱스 기준으로 병합되기 때문에, 원래 데이터프레임에 없던 셀들은 NaN으로 채워집니다.
    # 칼럼 레벨로 병합 (옆으로 붙임)
    pd.concat([df_1, df_2], axis=1)


    2️⃣  칼럼 이름이 다른 데이터프레임끼리 합치는 경우

    • 위에서 만들었던 df_2 에 새로운 칼럼을 붙였습니다. 이제 두 데이터프레임의 칼럼이 다른데요,
      이런 경우 파라미터 join 을 추가하여, 어떤 방식으로 병합할지 정해줘야 합니다.

     

    2️⃣-1.  합집합으로 병합하기 (Outer Join)

    • 합집합처럼, 한쪽에 없는 칼럼이어도 포함해서 병합하는 방식입니다.
    • 파라미터 join = 'outer' 로 지정해주면 됩니다. (데이터베이스 Outer Join과 동일한 방식)
    • 아래처럼 df_2의 grade 칼럼까지 포함해서 합쳐집니다. df_1에서 grade는 없는 칼럼이었으니 NaN값으로 채워지구요.

    2️⃣-2.  교집합으로 병합하기 (Inner Join)

    • 마찬가지로 교집합처럼, 한쪽에 없는 칼럼이면 제외하고 공통으로 존재하는 칼럼만 남기는 방식입니다.
    • 파라미터 join = 'inner' 로 지정해주면 됩니다. (데이터베이스 Inner Join과 동일한 방식)
    # 합집합 방식으로 병합하기 (Outer Join) : 한쪽에 없는 칼럼이어도 전부 포함
    pd.concat([df_1, df_2], join = 'outer')
    
    # 교집합 방식으로 병합하기 (Inner Join) : 한쪽에 없는 칼럼이면 제외, 공통 칼럼만 남김
    pd.concat([df_1, df_2], join = 'inner')


     

    728x90
    반응형