일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- matplotlib
- math
- gas
- google apps script
- array
- Github
- Google Excel
- 파이썬
- SQL
- PySpark
- Google Spreadsheet
- Excel
- numpy
- Redshift
- django
- Tkinter
- PostgreSQL
- hive
- string
- list
- Python
- Mac
- c#
- PANDAS
- GIT
- Java
- Kotlin
- dataframe
- Apache
- Today
- Total
달나라 노트
Python Pandas : melt (unpivot 가로 데이터를 세로 데이터로 변경) 본문
Python Pandas : melt (unpivot 가로 데이터를 세로 데이터로 변경)
CosmosProject 2021. 6. 8. 21:00
Python Pandas에서 제공하는 melt method는 가로 데이터를 세로 데이터로 변경해주는 기능을 가지고있습니다.
(가로 데이터를 세로 데이터로 변경하는것을 보통 unpivot이라고 합니다.)
Pandas pivot_table method와 반대의 개념이죠.
Pandas pivot_table 참고
https://cosmosproject.tistory.com/29
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의 형태로 묶어서 전달하면 됩니다.
'Python > Python Pandas' 카테고리의 다른 글
Python Pandas : values (DataFrame을 numpy arrary 형태로 변환하기) (0) | 2021.06.11 |
---|---|
Python Pandas : shape (DataFrame의 행/열 개수(DataFrame 크기) 반환) (0) | 2021.06.11 |
Python Pandas : dropna (NaN value가 있는 row/column 제거하기) (0) | 2021.06.08 |
Python Pandas : notna (누락값 여부 체크하기) (0) | 2021.03.18 |
Python Pandas : rolling (DataFrame window function) (0) | 2021.01.22 |