id_vars)로 설정하고, 나머지 열인 측정 변수(value_vars)를 행 방향으로 언피벗하여 두 개의 비-식별자 열인 variable과 value만 남게 되는 형태로 데이터프레임을 변환pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)
Parameters
id_vars : tuple, list, or ndarray, optional
식별자 변수로 사용할 열을 지정하는 매개변수
value_vars : tuple, list, or ndarray, optional
언피벗할 열을 지정하는 매개변수. 지정하지 않으면 id_vars로 설정되지 않은 모든 열이 사용.
var_name : scalar
'variable' 열에 사용할 이름을 지정하는 매개변수. None이면 frame.columns.name 또는 'variable'가 사용됨
value_name : scalar, default ‘value’
'value' 열에 사용할 이름을 지정하는 매개변수. 기본값은 'value'
col_level : int or str, optional
열이 MultiIndex인 경우 해당 레벨을 사용하여 언피벗하는 매개변수.
ignore_index : bool, default True
True로 설정하면 원래의 인덱스가 무시. False로 설정하면 원래의 인덱스가 유지. 필요에 따라 인덱스 레이블이 반복.
Returns
DataFrame : Unpivoted DataFrame.
melt()에 대해 설명하면서 언피벗한다~ 라고 했다. 언피벗이 무엇일까?
데이터프레임의 구조를 변형하여 wide(넓은) 형식에서 long(긴) 형식으로 데이터를 재구성하는 작업
일반적으로 wide(넓은) 형식의 데이터 프레임은
반대로 long 형식의 데이터프레임은
그래서 Unpivot 작업이란
설명들이 너무 복잡하다
예시 데이터로 이해해보자!
wide한 데이터 테이블을 만들어보자
# 예시 데이터 생성
data = {
'이름': ['Spencer', 'Lune', 'Mark'],
'국어': [66, 90, 95],
'영어': [77, 80, 65],
'수학': [99, 80, 75]
}
df = pd.DataFrame(data)

# long형식 데이터프레임 출력
df.melt(id_vars='이름', value_vars=['국어','영어','수학'])
인자 설명
언피봇을 해서 데이터 프레임을 다시 조립하는 과정
id_vars= : id값으로 지정. 분류 기준이 됨.
value_vars= : id의 값들을 지정

그럼 위와 같이 나온다
마치 SQL의 cross join과 같이 열과 행을 모두 곱해서 가져옴!
이때 새로 생긴 컬럼의 이름이 지정이 안되어 variable,value로 나온다.
컬럼의 이름도 지정해 주자.
# long형식 데이터프레임 출력
df.melt(id_vars='이름', value_vars=['국어','영어','수학'],var_name='과목',value_name='점수')

인자 설명
var_name= : variable의 이름을 지정
value_name : value의 이름을 지정
id_vars 매개변수에 '이름'을 지정하여 식별자 변수로 설정value_vars 매개변수에 ['국어', '영어', '수학']를 지정하여 언피벗할 열을 선택var_name 매개변수에 '과목'을, value_name 매개변수에 '점수'를 지정하여 열 이름을 변경이번에는 우리가 사용했던 역대한국야구순위 데이터를 가지고 실습을 해보자

해당 데이터는 wide한 데이터이다.
왜냐??
연도가 늘어날 수 록 가로로 늘어날테니!
(팀이 늘 수 도 있지만 평균적으로 연도가 더 빨리 늘었다..)
이를 melt()를 이용해 long하게 만들어보자
league.melt(id_vars='팀이름',value_vars=['2017','2018','2019','2020','2021'], var_name = '시즌', value_name ='순위')
어우! 코드가 너무 길다.. value_vars 에 들어갈 값을 줄여보자
# 코드 정리
col = league.columns.drop('팀이름')
요렇게 하면 원본데이터 컬럼에서 팀이름 빼고 다 가져와 지게 된다.
이제 다시 코드를 작성하면 동일하게 long형 데이터가 만들어진다.
league.melt(id_vars='팀이름',value_vars=col, var_name = '시즌', value_name ='순위')

