Breaking

2018년 10월 12일 금요일

python pandas.pivot_table <별별정보>

python pandas.pivot_table <별별정보>

python에서 사용하는 pandas.pivot_table에 대해 자세히 알아보자

우선 pivot은 중심점을 보통 이야기하고 table은 표를 언급할 때 사용한다.
python에서의 pivot table은 사용자가 중심이 되는 표를 만들어 낼 수 있는 데이터 구조를 뜻하는 것 같다.

python을 배우고 pandas를 배우면 반드시 찾아가는 사이트 구글에서 구글링하면 바로 정의에 접근할 수 있는데 API Reference 링크를 아래에 걸어두겠다.

pandas.pivot_table - pandas 0.23.4 documentation API Reference

사이트에 들어가면 당연히 그 정의와 변수들 그리고 그 예시에 대해 나와있지만 나는 정의에 따른 변수들을 살펴볼 것이다.



엑셀에서 많이 사용하는 형태의 스프레드시트 spread sheet style의 pivot table을 DataFrame 형태로 만들 수 있다. pivot_table의 장점은 다중 인덱스 사용이 가능하고 인덱스,열, 값들을 변수들을 통해 지정해줄 수 있다.

물론 stack, unstack을 통한 다중 인덱스가 가능하다는 점도 있음에도 pivot table을 사용하는 이유는 한번에 좀 더 많은 것을 변수로 저장하고 이를 실행하는 것이 가능하기 때문아닐까?

pandas.pivot_table(data, values,index,columns,aggfunc,fill_value,margins,dropna,margins_name)
이렇게 표현이 가능하다.

우선 category 형태의 열을 3개 numeric 형태의 열을 3개로 구성되게 DataFrame을 만들었다

table=pd.DataFrame({'A':['a1','a2','a1','a2','a1','a2','a1','a2'],
                   'B':['b1','b1','b2','b2','b3','b3','b4','b4'],
                   'C':['c1','c1','c1','c2','c2','c2','c1','c2'],
                   'D':[11,12,13,14,15,16,17,18],
                   'E':[21,22,23,24,25,26,27,28],
                   'F':[31,32,33,34,35,36,37,38]})

 
우리가 여기서 보고싶은 예시는 인덱스,열, 값들을 어떻게 설정하고 설정했을 때 어떻게 변화하는지를 보고싶다.

그 전에 변수들의 Default 값과 Optional한 변수가 무엇인지 알아야한다.

values : Optional 즉 선택할 수도 하지 않을 수도 있다. 그리고 aggregate가능한 numeric column이어야만 한다.
index와 columns : 선택해야하는 항목이고 데이터의 열, groupby를 통해 저장된 값, array, list가 사용가능하다. 다만 둘 중 하나의 값과 values 값을 쓰면 values에서 사용한 열이 pivot_table의 columns이 된다.
aggfunc :  어떤 방식으로 모집할 것인지를 정하는 변수로 default는 np.mean 산술 평균을 의미하고 수동으로 우리가 선택이 가능하다.
fill_value :  np.nan을 어떤 값으로 대체하는 것이 가능한 변수
margins :  우리가 정한 index와 column에 따라 만들어진 데이터프레임의 행과 열의 합을 구할 수 있는 변수이다.
dropna열의 값들이 모두 Nan으로 되어있는 해당 열을 제외시키기 위한 변수로
이미 default로 True가 설정되었기 때문에 자동으로 실행
margins_name : 앞에서 사용한 margins의 이름을 정하는 변수로 default는 'All'이라는 이름을 가지지만 다른 이름으로 수정하고 싶은 경우 사용한다.(쓸모없어보이는 기능인듯한..)

변수 사용 설명에 앞서 category column은 'A','B','C'이고 numeric column은 'D','E','F'로 설정함을 다시 알려드린다. 그만큼 변수 선언이 무엇인지가 중요하다는 이야기!

설명 순서는 아래와 같다.

1. index와 value 2개의 변수 사용
2. columns와 values 2개의 변수 사용
3. index, column 2개의 변수 사용
4. index, column, value 3개의 변수 사용
5. aggfunc
6.fill_value
7. margins
8. margins_name
9. dropna

1. index와 value 2개의 변수 사용

1-1)
pd.pivot_table(table,index='A',values='B')
=>pd.pivot_table(table,index='catagory column',values='catagory column')
결과 : 실행되지 않음 (values는 반드시 aggregate가 가능한 numeric으로 설정해야함)

1-2)
pd.pivot_table(table,index='A',values='D')
=>pd.pivot_table(table,index='catagory column',values='numeric column')
결과 : 실행됨
 'D'('numeric column')가 열이면서 values
이 때의 aggfunc=np.mean 즉 평균값임을 유의하자.
(aggfunc를 변형 방법을 알고싶다면 5번을 참조하길 바란다.)

 
1-3)
pd.pivot_table(table,index='E',values='D')
=>pd.pivot_table(table,index='numeric column',values='numeric column')
결과 : 실행됨
'E'('numeric column')가 index,  'D'('numeric column')가 열이면서 values


1-4)
pd.pivot_table(table,index=['A','B'],values='D')
결과 : 실행됨
다중 인덱스는 list처럼 만들어서 사용가능

 
pd.pivot_table(table,index=['A','B'],values=['D','E']) 역시도 사용가능


 2. columns와 values 2개의 변수 사용

2-1)
 pd.pivot_table(table,columns='A',values='B')
 =>pd.pivot_table(table, columns='catagory column', values='catagory column')
 결과 : 실행되지 않음  (values는 반드시 aggregate가 가능한 numeric으로 설정해야함)

2-2)
pd.pivot_table(table,columns='A',values='D')
=>pd.pivot_table(table, columns='catagory column', values='numeric column')
결과 : 실행됨
'D'('numeric column')가 index이면서 values
.
2-3)
pd.pivot_table(table,columns='E',values='D')
=>pd.pivot_table(table, columns='numeric column', values='numeric column')
결과 : 실행됨
'E'('numeric column')가 column,  'D'('numeric column')가 index이면서 values

<2-2 2-3="">
2-4)
pd.pivot_table(table,columns=['A','B'],values=['D','E'])
결과 : 실행됨
다중 인덱스 사용 가능을 보여준다.

3. index, column 2개의 변수 사용


3-1)
pd.pivot_table(table,index='A',columns='B')
=>pd.pivot_table(table, index='catagory column', columns='catagory column')
결과 : 실행됨
따로 value 값을 설정하지않았기 때문에 table 데이터프레임에 존재하는 모든 numeric column들을  index와 column에 맞게 자동으로 설정한다.

3-2)
pd.pivot_table(table,index='D',columns='B')
=>pd.pivot_table(table, index='numeric column', columns='catagory column')
결과 : 실행됨

3-3)
pd.pivot_table(table,index='D',columns='E')
=>pd.pivot_table(table, index='numeric column', columns='numeric column')
결과 : 실행됨

<위에부터 3-1, 3-2, 3-3>

4. index, column, value 3개의 변수 사용

4-1)
pd.pivot_table(table,index='A',columns='B',values='C')
=>pd.pivot_table(table, index='catagory column', columns='catagory column', values='catagory column')
결과 : 실행불가 (values는 반드시 aggregate가 가능한 numeric으로 설정해야함)

4-2)
pd.pivot_table(table,index='A',columns='B',values='D')
=>pd.pivot_table(table, index='catagory column', columns='catagory column', values='numeric column')
결과 : 실행됨

4-3) 다중 인덱스
pd.pivot_table(table,index=['A','C'],columns='B',values=['D','E'])
결과 : 실행됨

<위에부터 4-2, 4-3>

4-4) mixing column
pd.pivot_table(table,index=['A','F'],columns=['B','E'],values=['D'])
결과 : 실행됨


5. aggfunc


5-1) aggfunc=np.sum
pd.pivot_table(table,index=['A'],values=['D','E'],aggfunc=np.sum)
vs
pd.pivot_table(table,index=['A'],values=['D','E'])


둘 다 aggfunc를 사용하지만 위에는 np.sum을 아래는 np.mean을 사용합니다.
둘의 차이가 보이시나요?

이외에도 np.max, min, std, var,floor,exp,log 등등 numpy 함수를 다양하게 사용할 수 있습니다.

6.fill_value

6-1)
3-2)에서  nan이 많이 많았던 것을 보실 수 있습니다.

pd.pivot_table(table,index='D',columns='B')
=>pd.pivot_table(table, index='numeric column', columns='catagory column')

여기에 fill_value를 사용해보겠습니다.
pd.pivot_table(table,index='D',columns='B',fill_value=0)


nan을 scalar 값으로 변환된 것을 확인가능합니다.
이것은 나중에 encoding을 하거나 따로 뽑아서 계산할 때 매우 유용하게 쓰일 수 있는 변수인 것 같습니다.


7. margins

7-1)
3-2) 식을 다시 한 번 써보겠습니다. 대신 여기서 fill_value를 쓴 것과 쓰지 않은 것의 차이를 확인해보세요

pd.pivot_table(table,index='D',columns='B',margins=True)
vs
pd.pivot_table(table,index='D',columns='B',fill_value=0,margins=True)


원래 nan이 포함된 데이터에서 sum을 하는 경우 어떤 값을 더해도 Nan이 되기때문에
margins를 사용해도 Nan이 될 것이라는 저의 예상과는 달리 알아서 걸러주는 기능이 포함되어있네요. 상황에 따라서는 유용하게 써먹을 수 있을 것 같습니다.

8. margins_name


이름을 바꿔주는 변수이기때문에 유용성이 있을지는 모르겠습니다만 뭐 있으니... 사용은 해봅시다.
이번에도 역시 3-2 코드를 사용하겠습니다.

pd.pivot_table(table,index='D',columns='B',fill_value=0,margins=True)
vs
pd.pivot_table(table,index='D',columns='B',fill_value=0,margins=True, margins_name='Tot')


margins의 이름이 바뀐 것을 확인할 수 있습니다. All -> Tot

9. dropna

dropna는 True가 default로 설정되어 있기때문에 자동으로 삭제해줍니다.
이를 확인하기위해 table에 nan으로 가득찬 열 'G'를 추가한 후 사용해보겠습니다.

 
 
pd.pivot_table(table,index='A',columns='B',values=['D','G'],dropna=False)
vs
pd.pivot_table(table,index='A',columns='B',values=['D','G'])

dropna를 False해주면 nan으로 가득찬 열을 삭제하지 않는다. 반면 default로 설정된 dropna 자체를 언급하지않으면 자동으로 없애주는 기능을 한다.
필요에 따라 나타내고 없애고의 선택을 할 수 있는 변수로 사용가능할 것 같다.

마무리

여기까지가 pivot_table의 거의 모든 것을 다루었고 이것을 어떻게 활용하느냐는 개인의 역량에 달린 것 같다. 마치 필자가 사용한 데이터가 후진 것은 역량이 부족한 것처럼 말이다.

독자들은 좀 더 나은 데이터프레임으로 실행해고 연습해서 다중 인덱스 사용이 가능한 더 좋은 함수의 사용법을 익히시길 바라겠다.


ALL RIGHT RESERVED TWINSTARINFO