반응형

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
반응형

+ 최근 글