[Python] Pandas dataframe 집계하기 - Pivot Table

Sophie·2024년 10월 29일

Pandas pivot_table

  • Pivot Table

    • 데이터의 열을 기준으로 피벗테이블로 변환시키는 함수
    • 데이터프레임을 여러 축을 기준으로 자유롭게 변환 → 데이터 가공 및 시각화에 유용하게 사용 가능
  • 기본 문법

    • 간단한 버전
      - 피벗테이블의 값, 행, 열 / 집계방식 / 결측치처리여부 / 정렬여부

      import pandas as pd
      
      df.pivot_table(values='col*', index='col$', columns='col#', aggfunc=<'mean'|'median'|'count'|'nunique'..>, dropna=<True|False>, sort=<True|False>)
    • 공식 문서 기준
      - 외에도 더 다양한 매개변수들을 pivot_table의 파라미터로 사용 가능하다.

      DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=<no_default>, sort=True)
  • 예시

    • pivot_table 샘플 데이터 조작 예시

      ### 샘플 데이터 ###
      df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                                "bar", "bar", "bar", "bar"],
                          "B": ["one", "one", "one", "two", "two",
                                "one", "one", "two", "two"],
                          "C": ["small", "large", "large", "small",
                                "small", "large", "small", "small",
                                "large"],
                          "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
                          "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})
      
      table = pd.pivot_table(df, value='D', index=['A','B'], columns=['C'], aggfunc='sum')
      table
      
      ### 출력 ###
      # C        large  small
      # A   B
      # bar one    4.0    5.0
      #     two    7.0    6.0
      # foo one    4.0    1.0
      #     two    NaN    6.0
    • 집계함수 (aggfunc) 를 값 별로 다르게 적용할 수도 있다.

      table = pd.pivot_table(df, values=['D', 'E'], index=['A', 'C'],
                              aggfunc={'D': "mean",
                                       'E': ["min", "max", "mean"]})
      table
      
      ### 출력 ###
      #                  D   E
      #               mean max      mean  min
      # A   C
      # bar large  5.500000   9  7.500000    6
      #     small  5.500000   9  8.500000    8
      # foo large  2.000000   5  4.500000    4
      #     small  2.333333   6  4.333333    2
  • 작성방식

    • pivot_table을 직접 작성하려고 하다보면, 생각하는 흐름에 따라서 두 가지 방향으로 작성하게 되는 것 같다.

      Case 1. pivot_table( )의 괄호 안에 df 를 쓰는 경우
      : pd.pivot_table을 작성한 후 → 괄호 안에 데이터인 df를 작성함.

      Case 2. pivot_table( )의 괄호 안에 df 를 쓰지 않는 경우
      : 데이터인 df를 먼저 불러와서, df.pivot_table 을 쓰는 경우

    • 결론은..! 두 케이스 모두 정상적으로 동작했다.
      지금은 다른 pandas 기능을 쓸 때처럼 ' pd.~ ' 으로 시작하는 게 손에 익숙하기 때문에 첫번째 케이스로 주로 작성하고 있다.

        
        # Case 1.
        # pd.pivot_table로 쓰고, 사용할 데이터는 괄호 안에서 df 로 불러옴.
        table = pd.pivot_table(df, value='D', index=['A','B'], columns=['C'], aggfunc='sum')
        table
        
        # Case 2.
        # df.pivot_table로 써서 사용할 데이터를 앞에서 df. 으로 불러옴.
        table = df.pivot_table(value='D', index=['A','B'], columns=['C'], aggfunc='sum')
        table
        

0개의 댓글