-- Data --/- Python -

[ Pandas ] melt() method 를 사용해 DataFrame Unpivot 화

녕녀기 2023. 5. 25. 16:23

본문으로

안녕하세요. 녀기입니다.

 

오늘 본명조로 글씨 처음 써보는데 까리합니다(?)

 

(여자친구가 쓴거 보고 따라 쓴 것은 비밀입죠.)

 

오늘은 제가 그토록 알고 싶었던 기능을 알고 싶었기 때문에 포스팅에 들어갔습니다.

 

어떤 기능인지 한번 보시죠!


melt()

melt 메소드는 데이터프레임 피벗 해제를 할 때 사용합니다.

 

어떻게 사용하는지 아래를 보면서 확인해 봅시다.

allLeisure.head()

Table 1. melt 적용하기 전

제가 만든 데이터프레임 입니다.

 

통계 자료를 바탕으로 만든 데이터프레임인데,

 

평가 항목이 같이 나와 있습니다.

 

 

컬럼을 평가 항목들로 나열해 놓는 것도 데이터를 처리하는데 유용할 수도 있지만,

 

처음 저 데이터를 봤을 때 저 컬럼명이 무엇을 나타내는지 모를 수도 있습니다.

 

 

그래서 저는 '평가 항목'과 '응답 인원'이라는 새로운 컬럼을 만들어 데이터프레임을 다시 만들고 싶습니다.

 

예를 들면,

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 파라미터는, 기존 컬럼의 값을 뒤따라오는 새로운 컬럼에 할당해주고, 컬럼명을 부여해 줍니다.

 

"응답인원"이라고 입력합니다.

 

실행을 시키면

Table 3. melt 적용 후

 

위와 같이, 행 길이가 늘어나면서

 

컬럼이 줄어들고, 컬럼들이 데이터로 입력된 모습을 볼 수 있습니다.


저는 이 과정을 제 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