달나라 노트

Python Pandas : melt (unpivot 가로 데이터를 세로 데이터로 변경) 본문

Python/Python Pandas

Python Pandas : melt (unpivot 가로 데이터를 세로 데이터로 변경)

CosmosProject 2021. 6. 8. 21:00
728x90
반응형

 

 

 

 

 

Python Pandas에서 제공하는 melt method는 가로 데이터를 세로 데이터로 변경해주는 기능을 가지고있습니다.

(가로 데이터를 세로 데이터로 변경하는것을 보통 unpivot이라고 합니다.)

Pandas pivot_table method와 반대의 개념이죠.

 

Pandas pivot_table 참고

https://cosmosproject.tistory.com/29

 

Python Pandas : pandas.pivot_table

pandas.pivot_table pivot_table은 세로 데이터를 가로 데이터로 변경해주는 역할을 합니다. 먼저 테스트용 DataFrame을 생성합시다. import pandas as pd dict_1 = { 'dt': [20201201, 20201201, 20201201, 20201..

cosmosproject.tistory.com

 

 

 

melt syntax

pandas.melt(df,
            id_vars=['col1', 'col2', ...],
            value_vars=['col3', 'col4', ...],
            var_name='var_name',
            value_name='value_name',
            ignore_index=True)

 

Pandas melt method의 인자들은 위와 같습니다.

 

df

melt를 적용할 DataFrame

 

 

id_vars=['col1', 'col2', ...]

기준 column이 될 column들

 

 

value_vars=['col3', 'col4', ...]

unpivot(melt)의 대상이 될 column들

 


var_name='var_name'

unpivot(melt) 후 id_vars에 명시된 데이터들이 담긴 column 이름

 


value_name='value_name'

unpivot(melt) 후 value_vars에 명시된 데이터들이 담긴 column 이름

 


ignore_index=True/False (defalut = True)

True = unpivot(melt) 후 결과 dataframe의 index를 reset한다.

False = unpivot(melt) 후 결과 dataframe의 index를 reset하지 않고 원본 DataFrame의 index를 사용한다.

 

 

 

 

 

 

 

 

 

 

 

melt method를 알아보기 위한 test DataFrame을 생성합시다.

import pandas as pd

dict_test = {
    'item_code': [1, 2, 3, 4, 5],
    '20210101': [1000, 2000, 3000, 4000, 5000],
    '20210102': [1010, 2050, 2900, 4000, 4800],
    '20210103': [900, 2100, 2950, 4100, 4900],
}

df_test = pd.DataFrame(dict_test)
print(df_test)



-- Result
   item_code  20210101  20210102  20210103
0          1      1000      1010       900
1          2      2000      2050      2100
2          3      3000      2900      2950
3          4      4000      4000      4100
4          5      5000      4800      4900

 

위 DataFrame은 5개의 item에 대해 2021-01-01 ~ 2021-01-03 기간동안의 가격 변화 정보를 담고 있습니다.

 

보시면 각 날짜가 컬럼으로 되어있기 때문에 어떤 상품의 날짜별 가격 변화를 보려면 가로(하나의 행)로 봐야합니다.

시간의 흐름이 가로로 움직이기 때문에 가로 데이터라는 의미이죠.

 

이걸 세로 데이터로 바꾸려고합니다.

 

 

 

세로 데이터 형태로 바꾸면 item별 특정 날짜의 price가 아래 표처럼 표시되어야 합니다.

item_code date price
1 20210101 1000
1 20210102 1010

 

 

 

 

import pandas as pd

dict_test = {
    'item_code': [1, 2, 3, 4, 5],
    '20210101': [1000, 2000, 3000, 4000, 5000],
    '20210102': [1010, 2050, 2900, 4000, 4800],
    '20210103': [900, 2100, 2950, 4100, 4900],
}

df_test = pd.DataFrame(dict_test)
print(df_test)

df_melted = pd.melt(df_test,
                    id_vars=['item_code'],
                    value_vars=['20210101', '20210102', '20210103'])
print(df_melted)



-- Result
   item_code  20210101  20210102  20210103
0          1      1000      1010       900
1          2      2000      2050      2100
2          3      3000      2900      2950
3          4      4000      4000      4100
4          5      5000      4800      4900

    item_code  variable  value
0           1  20210101   1000
1           2  20210101   2000
2           3  20210101   3000
3           4  20210101   4000
4           5  20210101   5000
5           1  20210102   1010
6           2  20210102   2050
7           3  20210102   2900
8           4  20210102   4000
9           5  20210102   4800
10          1  20210103    900
11          2  20210103   2100
12          3  20210103   2950
13          4  20210103   4100
14          5  20210103   4900

 

먼저 위 예시의 melt method에 쓰인 내용을 봅시다.

 

df_melted = pd.melt(df_test, id_vars=['item_code'], value_vars=['20210101', '20210102', '20210103'])

 

df_test

melt method의 첫 번째 인자는 melt method를 적용시킬 DataFrame을 의미합니다.

 

 

id_vars=['item_code']

id_vars 인자는 melt를 할 때 기준이 될 데이터가 있는 컬럼을 의미합니다.

위 예시에서는 item들의 날짜별 가격변화를 나타내는 데이터이므로 기준이 되는건 item입니다.

 

 

value_vars=['20210101', '20210102', '20210103']

value_vars 인자는 melt를 할 때 가로 형태에서 세로 형태로 변형될 data를 의미합니다.

가로 데이터에서는 날짜가 가로로 있었고, 날짜를 세로로 바꿀테니 세로 데이터로 바꿀 날짜를 list에 담아서 전달합니다.

 

 

그러면 결과에서 보이는 것 처럼 각 상품별 특정 날짜에 대한 가격 정보의 시간 흐름이 위에서 아래로(세로로) 변경되었습니다.

 

 

 

 

 

 

 

 

 

import pandas as pd

dict_test = {
    'item_code': [1, 2, 3, 4, 5],
    '20210101': [1000, 2000, 3000, 4000, 5000],
    '20210102': [1010, 2050, 2900, 4000, 4800],
    '20210103': [900, 2100, 2950, 4100, 4900],
}

df_test = pd.DataFrame(dict_test)
print(df_test)


df_melted = pd.melt(df_test,
                    id_vars=['item_code'],
                    value_vars=['20210101', '20210102', '20210103'],
                    var_name='date',
                    value_name='price')
print(df_melted)



-- Result
   item_code  20210101  20210102  20210103
0          1      1000      1010       900
1          2      2000      2050      2100
2          3      3000      2900      2950
3          4      4000      4000      4100
4          5      5000      4800      4900

    item_code      date  price
0           1  20210101   1000
1           2  20210101   2000
2           3  20210101   3000
3           4  20210101   4000
4           5  20210101   5000
5           1  20210102   1010
6           2  20210102   2050
7           3  20210102   2900
8           4  20210102   4000
9           5  20210102   4800
10          1  20210103    900
11          2  20210103   2100
12          3  20210103   2950
13          4  20210103   4100
14          5  20210103   4900

 

위 예시에선 melt method에 var_name, value_name이라는 인자가 추가되었습니다.

 

melt method가 적용된 후에는 날짜가 담기는 컬럼, 가격이 담기는 컬럼 2가지가 새로 생성되게됩니다.

 

var_name='date'

var_name 인자는 value_vars에 담긴 데이터가 쌓이는 컬럼의 이름을 지정해줍니다.

 

value_name='price'

value_name 인자는 melt되어 나온 값들(여기서는 가격 정보)이 쌓이는 컬럼의 이름을 지정해줍니다.

 

 

 

 

 

 

import pandas as pd

dict_test = {
    'item_code': [1, 2, 3, 4, 5],
    '20210101': [1000, 2000, 3000, 4000, 5000],
    '20210102': [1010, 2050, 2900, 4000, 4800],
    '20210103': [900, 2100, 2950, 4100, 4900],
}

df_test = pd.DataFrame(dict_test)
print(df_test)


df_melted = pd.melt(df_test,
                    id_vars=['item_code'],
                    value_vars=['20210101', '20210102', '20210103'],
                    value_name='price',
                    ignore_index=False)
print(df_melted)



-- Result
   item_code  20210101  20210102  20210103
0          1      1000      1010       900
1          2      2000      2050      2100
2          3      3000      2900      2950
3          4      4000      4000      4100
4          5      5000      4800      4900

   item_code  variable  price
0          1  20210101   1000
1          2  20210101   2000
2          3  20210101   3000
3          4  20210101   4000
4          5  20210101   5000
0          1  20210102   1010
1          2  20210102   2050
2          3  20210102   2900
3          4  20210102   4000
4          5  20210102   4800
0          1  20210103    900
1          2  20210103   2100
2          3  20210103   2950
3          4  20210103   4100
4          5  20210103   4900

 

지금까지의 예시를 다시 봐보면 melt method의 결과로 나온 DataFrame의 index는 0부터 다시 매겨져있습니다.

index가 reset된것이죠.

 

이것은 ignore_index=True가 기본값이기 때문입니다.

 

위 예시는 ignore_index=False로 설정하면서 결과 dataframe의 index를 reset하지 않고 기존 item_code들이 가진 index를 그대로 사용하고있습니다.

 

 

 

 

 

 

 

 

 

 

import pandas as pd

dict_test = {
    'item_code': [1, 2, 3, 4, 5],
    'item_name': ['a', 'b', 'c', 'd', 'e'],
    '20210101': [1000, 2000, 3000, 4000, 5000],
    '20210102': [1010, 2050, 2900, 4000, 4800],
    '20210103': [900, 2100, 2950, 4100, 4900],
}

df_test = pd.DataFrame(dict_test)
print(df_test)


df_melted = pd.melt(df_test,
                    id_vars=['item_code', 'item_name'],
                    value_vars=['20210101', '20210102', '20210103'])
print(df_melted)



-- Result
   item_code item_name  20210101  20210102  20210103
0          1         a      1000      1010       900
1          2         b      2000      2050      2100
2          3         c      3000      2900      2950
3          4         d      4000      4000      4100
4          5         e      5000      4800      4900

    item_code item_name  variable  value
0           1         a  20210101   1000
1           2         b  20210101   2000
2           3         c  20210101   3000
3           4         d  20210101   4000
4           5         e  20210101   5000
5           1         a  20210102   1010
6           2         b  20210102   2050
7           3         c  20210102   2900
8           4         d  20210102   4000
9           5         e  20210102   4800
10          1         a  20210103    900
11          2         b  20210103   2100
12          3         c  20210103   2950
13          4         d  20210103   4100
14          5         e  20210103   4900

 

위 예시는 기준 column을 item_code, item_name 2개로 설정했을 경우입니다.

위처럼 기준 column이 여러개라면 id_vars에 list의 형태로 묶어서 전달하면 됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
Comments