ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] 판다스 merge 함수로 파이썬 데이터프레임 병합하는 방법
    Python/Pandas, Numpy 2023. 5. 17. 10:45
    반응형

    판다스 merge 함수로 데이터프레임 병합하는 방법


    파이썬(Python)에서 표 형태의 데이터는 판다스 데이터프레임(Pandas DataFrame)이라는 객체를 이용해서 나타냅니다. 이를 이용하면 표 하나는 물론, 둘 이상의 표를 같은 기준을 중심으로 묶어서 확인해볼 수 있습니다.

     

     

    이번에는 판다스에서 제공하는 병합(merge) 기능을 이용해, 두 데이터프레임을 합치고 이를 시각화하는 작업을 해 보겠습니다. 해당 분석에는 Pandas와 플로틀리(plotly) 패키지가 사용되었으며, 아래 두 파일을 입력했으니 참고해 주세요.

     

     

    BestLoanList.xlsx
    0.08MB
    BestSellerList.xlsx
    0.09MB

     

     

    # 패키지 불러오기
    import pandas as pd
    import plotly.express as px
    
    # 데이터 불러오기
    loan = pd.read_excel('./data/BestLoanList.xlsx', thousands = ',')  # thousands: 숫자 구분자를 제거합니다
    sell = pd.read_excel('./data/BestSellerList.xlsx', thousands = ',')
    loan.head()
      순위 서명 저자 출판사 출판년도 ISBN ISBN부가기호 KDC 대출건수
    0 1월 1 달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예 팩토리나인 2020 NaN 9791165341909 3810.0 813.7 3433
    1 1월 2 완전한 행복 :정유정 장편소설 지은이: 정유정 은행나무 2021 NaN 9791167370280 3810.0 813.7 2903
    2 1월 3 아몬드손원평 장편소설 손원평 창비 2017 NaN 9788936434267 3810.0 813.7 2769
    3 1월 4 불편한 편의점 :김호연 장편소설 지은이: 김호연 나무옆의자 2021 NaN 9791161571188 3810.0 813.7 2713
    4 1월 5 달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예 팩토리나인 2020 2.0 9791165343729 3810.0 813.7 2605

     

    sell.head()
      순위 도서명 저자 출판사 출판 일자 정가 적립포인트 대분야 ISBN
    0 2021년 1 달러구트 꿈 백화점(레인보우 에디션) 이미예 팩토리나인 20200708 13800 690 판타지소설 9791165341909
    1 2021년 2 주린이가 가장 알고 싶은 최다질문 TOP 77(교보 단독 리커버) 염승환 메이트북스 20210726 18000 900 주식투자 9791160023459
    2 2021년 3 미드나잇 라이브러리(평행우주 에디션) 매트 헤이그 인플루엔셜 20210428 15800 790 영미소설일반 9791191056556
    3 2021년 4 조국의 시간 조국 한길사 20210531 17000 850 정치가 9788935668663
    4 2021년 5 소크라테스 익스프레스 에릭 와이너 어크로스 20210428 18000 900 고대/그리스철학 9791190030922

     

     

    이번에 사용할 데이터는 도서관 대출(loan) 및 서점 판매(sell)순위 데이터입니다. 전자의 데이터는 월별 대출순위 및 대출건수를 알 수 있으며, 후자의 데이터는 월별(2021년은 월 표기가 없으며, 2022년만 있음) 판매순위 및 가격, 대분야 등을 알 수 있습니다. 이렇게 서로 독립적인 데이터가 있다면, 이걸 합쳐서 각각의 관계 또는 새로운 분석을 확인해볼 수 있는습니다. 국내에 유통되는 모든 책은 고유한 ISBN을 가지고 있기 때문에, 이를 기준으로 병합을 해 보겠습니다.

     

     

    merge1 = pd.merge(loan, sell, left_on='ISBN', right_on='ISBN')
    merge1.head()
      월_x 순위_x 서명 저자_x 출판사_x 출판년도 ISBN ISBN부가기호 KDC 대출건수 월_y 순위_y 도서명 저자_y 출판사_y 출판 일자 정가 적립포인트 대분야
    0 1월 1 달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예 팩토리나인 2020 NaN 9791165341909 3810.0 813.7 3433 2021년 1 달러구트 꿈 백화점(레인보우 에디션) 이미예 팩토리나인 20200708 13800 690 판타지소설
    1 1월 1 달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예 팩토리나인 2020 NaN 9791165341909 3810.0 813.7 3433 1월 17 달러구트 꿈 백화점(레인보우 에디션) 이미예 팩토리나인 20200708 13800 690 판타지소설
    2 1월 1 달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예 팩토리나인 2020 NaN 9791165341909 3810.0 813.7 3433 2월 27 달러구트 꿈 백화점(레인보우 에디션) 이미예 팩토리나인 20200708 13800 690 판타지소설
    3 1월 1 달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예 팩토리나인 2020 NaN 9791165341909 3810.0 813.7 3433 3월 31 달러구트 꿈 백화점(레인보우 에디션) 이미예 팩토리나인 20200708 13800 690 판타지소설
    4 1월 1 달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예 팩토리나인 2020 NaN 9791165341909 3810.0 813.7 3433 4월 53 달러구트 꿈 백화점(레인보우 에디션) 이미예 팩토리나인 20200708 13800 690 판타지소설

     

     

    데이터프레임 병합은 pd.merge 함수를 이용해 수행합니다. 해당 함수의 옵션은 아래 내용을 참고해 주시기 바랍니다. left_on, right_on 매개변수(parameter)에 각각의 기준 열(column) 이름을 지정해주면 손쉽게 병합이 가능하지요. 해당 병합은 SQL join 등에 익숙하다면 간단하게 원리를 알아챌 수 있습니다.

     

     

    pd.merge(데이터프레임1, 데이터프레임2, left_on='데이터프레임1의 기준 column', left_on='데이터프레임2의 기준 column', how='병합 옵션')

     

     

    참고로, merge는 SQL join 등과 같이 어떤 데이터프레임을 기준으로 병합할 것인지를 조절할 수 있습니다. 이에 대한 예시는 아래 사진을 참고해 주세요.

     

     

     

     

    이렇게 만들어낸 병합 데이터프레임인 merge1 을 사용해서는 기존 데이터프레임 각각이 보여줄 수 없는 특성을 보여줍니다. 예를 들어, 도서 분야별 대출건수의 관계를 확인해서 어떤 분야의 책을 많이 빌리는지 알고 싶다면, 아래와 같이 시각화해볼 수 있습니다. 판타지소설이 전반적으로 대출량이 많은 편이네요.

     

     

    fig = px.box(merge1, '대분야', '대출건수',
                     color='월_x',
                     width=720, height=480,
                     labels={'대분야': '분야',
                             '대출건수': '대출건수 (권)',
                             '월_x': '기준월'},
                     title='도서 분야별 대출 현황'
                    )
    
    fig.show()

     

     

    티스토리에서는 동적 그래프(interactive plot)의 표기가 되지 않는 관계로, 출력된 그래프를 캡쳐해서 올렸습니다. 만약 해당 코드를 직접 실행해 보신다면, 월별로 데이터를 선택해 볼 수 있으니 참고해 주시기 바랍니다.

    반응형

    댓글

문의: jwkang3929@naver.com