09-11. 피벗해제 (melt)
DataFrame.melt(id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)
개요
melt 메서드는 피벗 형태의 DataFrame을 기존 형태로 해체하는 메서드입니다.
사용법
기본 사용법
df.melt(id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)
id_vars : 기준이 될 열 입니다.
value_vars : 기준열에 대한 하위 카테고리를 나열할 열을 선택합니다.
var_name : 카테고리들이 나열된 열의 이름을 설정합니다.
value_name : 카테고리들의 값이 나열될 열의 이름을 설정합니다.
col_leve : multi index의 경우 melt를 수행할 레벨을 설정합니다.
ignore_index : 인덱스를 1,2,3, ... , n으로 설정할지 여부입니다. 기본적으로 True로 1,2,3, ... , n으로 설정됩니다.
예시
먼저, 아래와 같이 간단한 4x4 객체를 만들어 보겠습니다.
col = ['Country','Machine','Price','Brand']
data = [['Korea','TV',1000,'A'],
['Japan','TV',1300,'B'],
['Korea','PC',2000,'A'],
['Japan','PC',3000,'E']]
df = pd.DataFrame(data=data, columns=col)
print(df)
>>
Country Machine Price Brand
0 Korea TV 1000 A
1 Japan TV 1300 B
2 Korea PC 2000 A
3 Japan PC 3000 E
기본적인 사용법
Country를 기준으로하여 Machine과 Price의 값을 하위 카데고리로 melt를 수행해보겠습니다.
print(df.melt(id_vars='Country',value_vars=['Machine','Price']))
>>
Country variable value
0 Korea Machine TV
1 Japan Machine TV
2 Korea Machine PC
3 Japan Machine PC
4 Korea Price 1000
5 Japan Price 1300
6 Korea Price 2000
7 Japan Price 3000
ignore_index를 False로 할 경우 기존 인덱스를 사용하게 됩니다.
print(df.melt(id_vars='Country',value_vars=['Machine','Price'],ignore_index=False))
>>
# 기존 인덱스를 사용한 것을 확인 할 수 있습니다.
Country variable value
0 Korea Machine TV
1 Japan Machine TV
2 Korea Machine PC
3 Japan Machine PC
0 Korea Price 1000
1 Japan Price 1300
2 Korea Price 2000
3 Japan Price 3000
var_name과 value_name을 지정함으로써 열 이름의 기본값인 variable과 value를 원하는 값으로 변경할 수 있습니다.
print(df.melt(id_vars='Country',value_vars=['Machine','Price'],var_name='Category',value_name='val'))
>>
Country Category val
0 Korea Machine TV
1 Japan Machine TV
2 Korea Machine PC
3 Japan Machine PC
4 Korea Price 1000
5 Japan Price 1300
6 Korea Price 2000
7 Japan Price 3000
Multi-Index의 경우
Multi-Index(Multi-Columns)의 경우에는 인수들을 리스트-튜플로 설정하거나 col_level을 지정해줌으로써 원하는대로 출력이 가능합니다.
먼저 기존의 Country열을 좀더 세분화하여 Country-City로 Multi-Columns을 생성해보겠습니다.
col2 = [['Area','Area','Value','Value','Value'],['Country','City','Machine','Price','Brand']]
data2 =[['Korea','Seoul','TV',1000,'A'],
['Japan','Tokyo','TV',1300,'B'],
['Korea','Jeju','PC',2000,'A'],
['Japan','Kyoto','PC',3000,'E']]
df2=pd.DataFrame(data=data2, columns=col2)
print(df2)
>>
Area Value
Country City Machine Price Brand
0 Korea Seoul TV 1000 A
1 Japan Tokyo TV 1300 B
2 Korea Jeju PC 2000 A
3 Japan Kyoto PC 3000 E
이제 City에대해서 Price만 출력해보겠습니다.
하위 레벨에대해 출력할 경우 튜플을 이용해서 ('Area','City')로, ('Value','Price')로 세부설정을 입력하여 출력할 수 있습니다.
print(df2.melt(id_vars=[('Area','City')],value_vars=[('Value','Price')]))
>>
(Area, City) variable_0 variable_1 value
0 Seoul Value Price 1000
1 Tokyo Value Price 1300
2 Jeju Value Price 2000
3 Kyoto Value Price 3000
col_level을 설정해 줄 경우 보다 간단하게 하위 카테고리의 출력이 가능합니다.
print(df2.melt(id_vars='City',value_vars='Price',col_level=1))
>>
City variable value
0 Seoul Price 1000
1 Tokyo Price 1300
2 Jeju Price 2000
3 Kyoto Price 3000
'파이썬완전정복-Pandas DataFrame > 09. 가공' 카테고리의 다른 글
Pandas DataFrame 09-13. 값 변경 (replace) (0) | 2022.01.24 |
---|---|
Pandas DataFrame 09-12. 새 열 할당 (assign) (0) | 2022.01.24 |
Pandas DataFrame 09-10. 피벗생성_스프레드시트 기반 (pivot_table) (0) | 2022.01.23 |
Pandas DataFrame 09-09. 피벗변환 (pivot) (0) | 2022.01.23 |
Pandas DataFrame 09-08. 차원축소, 스칼라 변환 (squeeze) (0) | 2022.01.23 |