ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] stack 사용하여 Pivot Table 만들기 ( pivot_table )
    Python 2023. 7. 10. 11:13
    728x90
    반응형

    - 목차

     

    키워드.

    • pandas
    • stack, unstack
    • pivot

     

    들어가며.

    이번 글에서는 Pandas DataFrame 의 stack, unstack 함수를 활용하여 Pivot Table 을 생성하는 방법에 대해서 설명하려고 합니다.
    간단히 stack 과 unstack 에 관한 설명과 더불어 pivot table 을 생성하는 응용 과정에 대해 이야기하도록 하겠습니다.
     

    stack.

    Pandas 의 stack 함수는 모든 Column 들을 index 위치로 변경할 수 있습니다.
    먼저 간단한 예시를 통해서 stack 의 쓰임새를 보여드리겠습니다.
    stack 함수를 활용할 DataFrame 을 하나 생성하구요.

    import pandas as pd 
    names = ["Andy", "Bob", "Chris", "Daniel"]
    cities = ["Seoul", "Seoul", "Seoul", "NewYork"]
    df = pd.DataFrame({"name" : names, "city" : cities})

     
    Column 들을 stack 을 통해 index 위치로 변경합니다.
    아래의 결과와 같이 기존의 Column 이었던 "name""city" 칼럼이 Index 의 위치로 옮겨집니다.

    df.stack()

     
    stack 함수가 적용된 시점부터 index 는 MultiIndex 타입이 됩니다.
    즉, 2개의 Index 를 가지게 되죠.

    df.stack().index

     
    그리고 모든 칼럼들이 Index 의 위치로 옮겨졌기 때문에 더 이상 DataFrame 이 아닌 Series 으로 변환됩니다.

    print(type(df.stack()))
    >> <class 'pandas.core.series.Series'>

     
     

    unstack.

    unstack 은 stack 의 반대 역할을 수행합니다.
    index 를 column 의 위치로 변경합니다.

    stacked_df = df.stack()

     
    unstack 함수를 사용하여 원래 DataFrame 으로 복구가 가능합니다.

    stacked_df.unstack()

     
     

    level.

    stack 과 unstack 은 level 이라는 인자를 사용할 수 있습니다.
    위에서 확인할 수 있듯이, stack 함수를 사용하게 되면, index 는 MultiIndex 로 변환됩니다.
    이때 level 개념을 통해 MultiIndex 중에서 하나의 Index 를 Column 으로 변환이 가능합니다.
     
    "level=0" 와 같이 level 을 0 으로 설정하면 기존의 RangeIndex 가 Column 으로 자리를 옮깁니다.

    stacked_df.unstack(level=0)

     
    "level=1" 와 같이 level 을 1 으로 설정하면 name 과 city 가 Column 자리로 옮겨집니다.

    stacked_df.unstack(level=1)

     
     
     

    Pivot Table 만들기.

    DataFrame 을 Pivot Table 으로 변경하기 위해서 groupby, unstack 두가지를 사용할 예정입니다.
    스마트폰 브랜드와 사용자 간의 관계를 표현하기 위해 간단한 DataFrame 을 생성합니다.

    import pandas as pd
    names = ["Andy", "Bob", "Chris", "Daniel", "Emma", "Frank", "Gareth"]
    phones = ["Apple", "Samsung", "Apple", "Huawei", "Xiaomi", "Apple", "Samsung"]
    df = pd.DataFrame({"name" : names, "phone" : phones})

     

    assign.

    먼저 assign 함수를 1 로 구성된 list 를 "count" 칼럼에 추가합니다.

    df.assign(count=[1] * len(df))

    groupby.

    그리고 groupby 와 agg 함수를 사용하여 스마트폰 사용자와 브랜드 별 관계를 계산합니다.
    아래 데이터를 살펴보면 Andy 는 Apple 스마트폰 1개를 사용 중이고, Bob 은 Samsung 스마트폰 1개를 사용합니다.

    df.assign(count=[1] * len(df)).groupby(["name", "phone"]).agg({"count": "sum"})

     

     
    위에서 groupby 의 인자로써 2개의 Column 들을 사용하였는데요.
    이러한 경우에 index 는 MultiIndex 로 변경됩니다.

     

    unstack.

    그리고 unstack 함수를 사용하여 "phone"  index 를 Column 위치로 옮겨줍니다.
    그럼 아래와 같은 상태가 됩니다.

    (df.assign(count=[1] * len(df))
     .groupby(["name", "phone"])
     .agg({"count": "sum"})
     .unstack(level=1)
     )

     
     
    그리고 fillna 를 적용하여 nan 값을 0 으로 변경하고, droplevel 함수를 통해서 MultiIndex 를 하나의 Index 로 변경합니다.

    (df.assign(count=[1] * len(df))
     .groupby(["name", "phone"])
     .agg({"count": "sum"})
     .unstack()
     .fillna(0)
     .droplevel(0, axis=1))

     
    위와 같이 stack 함수를 통해서 두 칼럼들의 상호 관계를 Pivot Table 형식으로 표현할 수 있게 됩니다.

     

    pivot_table 함수 사용하기.

    사실 위와 같은 절차를 적용하는 것보다 pivot_table 함수를 활용하는 것이 훨씬 직관적이고 간편합니다.

    아래와 같은 name 과 phone 칼럼을 가지는 DataFrame 이 존재하고,

    import pandas as pd
    names = ["Andy", "Bob", "Chris", "Daniel", "Emma", "Frank", "Gareth"]
    phones = ["Apple", "Samsung", "Apple", "Huawei", "Xiaomi", "Apple", "Samsung"]
    df = pd.DataFrame({"name" : names, "phone" : phones})

     

    새로운 "count" 칼럼을 추가합니다.

    df.assign(count=[1] * len(df))

     

    그 이후에 아래와 같이 pivot_table 함수를 적용할 수 있습니다.

    name_phone_count_df = df.assign(count=[1] * len(df))
    name_phone_count_df.pivot_table(index="name", columns="phone", values="count")

     

     

     

     

     

     

    반응형
Designed by Tistory.