ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [pandas] DataFrame melt 알아보기
    Python 2024. 5. 17. 22:31
    728x90
    반응형

    - 목차

     

    키워드.

    • - Pivot Table

     

    들어가며.

    이번 글에서는 Pandas DataFrame 의 melt 함수에 대해서 알아보도록 하겠습니다.

    melt 는 Pivot Table 을 row-by-row 형식으로 변경할 수 있습니다.

    예를 들어, 아래 이미지와 같이 user 와 item 에 해당하는 DataFrame 이 존재한다고 가정하겠습니다.

     

    위 DataFrame 은 row-by-row 형식으로 user 와 item 의 관계를 보여줍니다.

    이는 user 와 item 각각의 Column 으로 설정하죠.

     

    위 DataFrame 의 Pivot Table 형식은 아래와 같습니다.

    Pivot Table 의 index 는 user, column 은 item 이 됩니다.

     

    이 상황에서 melt 함수를 사용하면 Pivot Table 을 원본 테이블로 변형이 가능합니다.

    import pandas as pd
    data = [
        ('Andy', 'item1'),
        ('Bob', 'item2'),
        ('Chris', 'item1'),
        ('Daniel', 'item1'),
        ('Frank', 'item2'),
        ('Emily', 'item1'),
    ]
    
    df = pd.DataFrame(data, columns=['user', 'item'])
    pivot_table = df.assign(count=[1] * len(df)).pivot_table(index='user', columns='item', values='count')
    pd.melt(pivot_table.reset_index(), id_vars='user', var_name='item').dropna(axis=0)

     

     

    melt 함수 알아보기.

    melt 함수는 이름에서 유추할 수 있듯이, "녹아서 흐른다" 는 이미지를 내포합니다.

    흔히 특정 칼럼의 값들을 Row 방향으로 확장시킬 수 있는데요.

    이 과정에서 기존의 DataFrame 이 변형되게 됩니다.

    melt 함수가 필요로하는 argument 들에 대해서 설명하여 melt 함수에 대해 자세히 알아보겠습니다.

     

    id_vars.

    id_vars 는 melt 함수에서 기준이 되는 Column 을 지정합니다.

    아래의 DataFrame 은 5명의 사람들이 5개의 음식을 얼마나 선호하는지에 대해 나타냅니다.

    import pandas as pd
    import numpy as np
    index = ['Andy', 'Bruce', 'Conan', 'Dennis', 'Fabian', 'Emma']
    columns = ['Apple', 'Banana', 'Candy', 'Donuts', 'Eggs']
    values = np.random.rand(len(index), len(columns))
    
    df = pd.DataFrame(values, index, columns)

     

    이는 Pivot Table 형태를 갖추고 있는데요.

    아래와 같은 melt 함수를 적용하여 모든 칼럼들을 variable 과 value 칼럼에 할당되도록 변형할 수 있습니다.

    마치 2개의 칼럼 내부로 녹아내린듯한 액션을 취합니다.

    이 과정에서 기준이 될 칼럼을 지정할 수 있는데요.

    id_vars 인자를 통해서 기준을 결정합니다.

    df = pd.DataFrame(values, index, columns)
    df.reset_index(names=['user']).melt(id_vars=["user"])

     

    value_vars.

    value_vars 인자는 melt 함수를 통해서 DataFrame 을 재배치시킬 때에, 모든 칼럼이 아닌 특정 칼럼들로 제한할 수 있습니다.

    아래의 예시에서는 Apple, Banana 두 칼럼만 Melt 되도록 제한합니다.

    아래 이미지에서 확인할 수 있듯이, Apple 과 Banana 만이 새로운 칼럼인 variable 와 value 에 배치됩니다.

    import pandas as pd
    import numpy as np
    index = ['Andy', 'Bruce', 'Conan', 'Dennis', 'Fabian', 'Emma']
    columns = ['Apple', 'Banana', 'Candy', 'Donuts', 'Eggs']
    values = np.random.rand(len(index), len(columns))
    
    df = pd.DataFrame(values, index, columns)
    df.reset_index(names=['user']).melt(id_vars=["user"], value_vars=['Apple', 'Banana'])

     

     

    var_name.

    melt 의 결과로써 "variable""value" 칼럼이 생성됩니다. 그리고 이 두 칼럼으로 데이터들이 재배치되죠.

    var_name 인자는 variable 칼럼의 이름을 지정할 수 있는 인자입니다.

    아래의 예시에서 Food_Name 이라는 새로운 칼럼명을 적용해보았습니다.

    import pandas as pd
    import numpy as np
    index = ['Andy', 'Bruce', 'Conan', 'Dennis', 'Fabian', 'Emma']
    columns = ['Apple', 'Banana', 'Candy', 'Donuts', 'Eggs']
    values = np.random.rand(len(index), len(columns))
    
    df = pd.DataFrame(values, index, columns)
    df.reset_index(names=['user']).melt(id_vars=["user"], 
                                        value_vars=['Apple', 'Banana'], 
                                        var_name='Food_Name'
                                       )

     

     

    value_name.

    value_name 은 melt 함수로 재배치된 DataFrame 의 "value" 칼럼의 이름을 지정할 수 있는 인자입니다.

    import pandas as pd
    import numpy as np
    index = ['Andy', 'Bruce', 'Conan', 'Dennis', 'Fabian', 'Emma']
    columns = ['Apple', 'Banana', 'Candy', 'Donuts', 'Eggs']
    values = np.random.rand(len(index), len(columns))
    
    df = pd.DataFrame(values, index, columns)
    df.reset_index(names=['user']).melt(id_vars=["user"], 
                                        value_vars=['Apple', 'Banana'], 
                                        var_name='Food_Name',
                                        value_name='Preference'
                                       )

     

     

     

    반응형
Designed by Tistory.