[ Pandas ] melt() method 를 사용해 DataFrame Unpivot 화
본문으로
안녕하세요. 녀기입니다.
오늘 본명조로 글씨 처음 써보는데 까리합니다(?)
(여자친구가 쓴거 보고 따라 쓴 것은 비밀입죠.)
오늘은 제가 그토록 알고 싶었던 기능을 알고 싶었기 때문에 포스팅에 들어갔습니다.
어떤 기능인지 한번 보시죠!

melt()
melt 메소드는 데이터프레임 피벗 해제를 할 때 사용합니다.
어떻게 사용하는지 아래를 보면서 확인해 봅시다.
allLeisure.head()
제가 만든 데이터프레임 입니다.
통계 자료를 바탕으로 만든 데이터프레임인데,
평가 항목이 같이 나와 있습니다.
컬럼을 평가 항목들로 나열해 놓는 것도 데이터를 처리하는데 유용할 수도 있지만,
처음 저 데이터를 봤을 때 저 컬럼명이 무엇을 나타내는지 모를 수도 있습니다.
그래서 저는 '평가 항목'과 '응답 인원'이라는 새로운 컬럼을 만들어 데이터프레임을 다시 만들고 싶습니다.
예를 들면,
id | 연도별 | 여가종류 | 조사대상 | 세부조사대상 | 평가항목 | 응답인원 |
0 | 2016 | 관광 | 연령별 | 15~19세 | 매우불만족한다 | 0 |
1 | 2016 | 관광 | 연령별 | 20대 | 매우불만족한다 | 0 |
2 | 2016 | 관광 | 연령별 | 30대 | 매우불만족한다 | 0 |
3 | 2016 | 관광 | 연령별 | 40대 | 매우불만족한다 | 0 |
4 | 2016 | 관광 | 연령별 | 50대 | 매우불만족한다 | 0 |
Table 2. 바꾸고자 하는 방향
2016년, 15~19세에 전 평가 항목에 대해 응답한 사람들이 전부 있었지만,
이를 하나하나 분리하는 것입니다.
Table 2와 같이 컬럼명에 있던 '매우불만족한다'가 데이터가 되고, '매우불만족한다' 가 0명이 그대로 옆에 붙게 됩니다.
만약 '보통이다'의 경우에는
2016, 관광, 연령별, 15~19세, 보통이다, 34
와 같은 순서로 데이터가 존재하게 만들 것입니다.
allLeisure = allLeisure.melt(id_vars=['연도별', '여가종류', "조사대상", "세부조사대상"], \
value_vars=["매우불만족한다", "불만족한다", "다소불만족한다", \
"보통이다", "다소만족한다", "만족한다", "매우만족한다"], \
var_name='평가항목', value_name='응답인원')
print("전체 행 길이 :", len(allLeisure[:]))
allLeisure.head()
이제 위에 코드를 하나씩 보도록 하죠.
먼저 id_vars 파라미터는 인덱스처럼 사용할 컬럼을 설정합니다.
'연도별'부터 '세부조사대상'까지는 그대로 있고, 평가 항목들이 새로이 데이터로 들어오기 때문에
'연도별'부터 '세부조사대상'이 기준이 됩니다.
value_vars 파라미터는, 이제 데이터처럼 사용할 컬럼을 설정합니다.
평가 항목으로 설정하려고 했던 컬럼을 입력해 줍시다.
var_name 파라미터는, 새로 데이터로 들어올 컬럼의 컬럼명을 설정합니다.
"평가항목"이라고 입력합니다.
value_name 파라미터는, 기존 컬럼의 값을 뒤따라오는 새로운 컬럼에 할당해주고, 컬럼명을 부여해 줍니다.
"응답인원"이라고 입력합니다.
실행을 시키면
위와 같이, 행 길이가 늘어나면서
컬럼이 줄어들고, 컬럼들이 데이터로 입력된 모습을 볼 수 있습니다.
저는 이 과정을 제 1정규화를 했다고 생각하는데
맞는지는 모르겠네요.
제가 알고 있는 제 1 정규화는 하나의 테이블에 하나의 속성만 가지게 하는 것인데,
평가 항목이 늘어서 있는 경우는 여러 개의 속성을 가지는 것이니, melt를 쓰는 것이 맞다고 판단이 됩니다(?)
(만약 제가 한 얘기에 문제가 있다면 댓글 남겨주세요!!)
어쨌든 굉장히 유익한 시간이었습니다.
다음에도 좋은 기능으로 돌아오겠습니다~~
뿅!

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.melt.html
pandas.DataFrame.melt — pandas 2.0.1 documentation
next pandas.DataFrame.memory_usage
pandas.pydata.org