[Python] pandas.melt()

2022. 5. 10. 21:52Python

pd.melt() 함수는 여러 개의 열은 행으로 쌓아 하나의 열로 만들고 싶을 때 사용하면 좋은 함수이다.

알아두면 데이터 전처리에 유용하게 쓸 수 있다.

 

1. pandas.melt()

Unpivot a DataFrame from wide to long format, optinally leaving identifiers set
pandas.melt(
	frame,
	id_vars=None, 
	value_vars=None,
	var_name=None,
	value_name='value',
	col_level=None,
	ignore_index=True)
  • id_vars : 인덱스 변수로 사용할 칼럼
  • value_vars : 하나의 열로 나열하고자 하는("unpivot") 칼럼 리스트/튜플/배열, 미지정시 id_vals를 제외한 모든 칼럼
  • var_name : variable 칼럼명 (default = 'variable')
  • value_name : value 칼럼명 (default = 'var_name')

 

2. 사용 예시

import pandas as pd

df = pd.DataFrame(
    columns = ["user", "202201", "202202", "202203", "202204"],
    data = [["a", 1, 3, 4, 5], ["b", 1, 2, 7, 8], ["c", 2, 3, 4, 5]]
)

df 출력 결과

예를 들어, 사용자(user)의 로그 데이터를 월별로 집계하여 위와 같은 테이블을 생성하였다고 가정하자. 

만약 사용자에 대한 월별 정보를 행방향으로 나열하고 싶다면, pd.melt() 함수를 활용할 수 있다.

 

df_melt = pd.melt(
    df, 
    id_vars="user", 
    value_vars=["202201", "202202", "202203", "202204"] 
)

df_melt 출력 결과

칼럼명에 있던 연월 정보가 새로운 칼럼으로 생성되고, 각 칼럼의 값들은 행 방향으로 쌓아 하나의 칼럼으로 재구성된 것을 확인할 수 있다. 이 경우에는 value_vars 값을 입력하지 않아도 같은 결과를 얻을 수 있다. (id_vars를 제외한 나머지 칼럼을 자동으로 선택하기 때문에)

 

df_melt = pd.melt(df, 
                  id_vars="user", 
                  value_vars=["202201", "202202", "202203", "202204"], 
                  var_name="month", 
                  value_name="click_count")

df_melt.sort_values("user")

df_melt 출력 결과 (정렬 후)

새롭게 생성되는 칼럼의 이름을 지정해주고 싶다면,

변수에 해당하는 칼럼은 var_name, 에 해당하는 칼럼은 value_name 인자에 원하는 값을 입력하면 된다.

 

3. 참고

[1] https://pandas.pydata.org/docs/reference/api/pandas.melt.html