본문 바로가기

Software/Python

Pandas pivot_table과 groupby, cut 사용하기

예전에 Python pandas에 대한 이야기를 했었는데요. 그때 빼먹고 하지 않은 (많은~~) 것들 중에 보강차원에서 오늘은 pivot_table과 groupby에 대해 이야기를 할려고 합니다. 이 글의 자료는 모두 [바로가기]에 있는 자료들이며, 그 예제들 중 일부를 따라하는 겁니다.^^

매니저나 도매상별 매출 집계 데이터입니다. pd.read_excel로 엑셀 파일을 읽구요.

Status 컬럼을 .cat.set_categories로 카테고리형으로 변경합니다.

그리고... pd.pivot_table 명령을 Name 컬럼을 기준으로 적용합니다. 그러면 중복된 Name들을 모두 하나로 표현해서 위 그림과 같은 결과가 나타납니다. 중복된 항목의 숫자들은 모두 평균으로 처리됩니다.

이번에는 Name, Rep, Manager를 모두 사용하는것입니다.

Name은 빼고, Manager와 Rep만 사용하면, 먼저 언급한 Manger를 중복된 것을 정리하면 위와 같이 되고, 그 안에 Rep을 각각 표현해주고 있습니다.

values 옵션을 사용해서 Price만 표현되도록 할 수 있습니다.

이제 aggfunc 옵션을 사용해서 기본적으로 평균값을 표현하던 것을 np.sum을 이용해서 합계를 표현하도록 할 수 있습니다.

혹은 np.mean으로 평균과 len 함수로 데이터의 갯수.. 이렇게 두 개를 표현할 수도 있습니다.

또, value가 나오는 부분에 columns=['Product']로 각 제품들을 표현할 수도 있구요^^

그리고 데이터가 없어서 NaN으로 표시된 부분을 fill_value=0로 0으로 채워줄 수도 있습니다.

values를 두 개 이상으로 잡고, columns를 설정하면 위 그림처럼 표현되기도 합니다.

또 product를 columns로 잡지 않고, index로 잡은 경우 위 그림처럼 나타나기도 합니다.

margins 옵션을 False로 하면 소숫점이 간결해지고 합계를 잡아주지 않습니다.

True로 두면 나눗셈 연산을 수행한 경우 소숫점이 길어지고 전체 항목을 잡아줍니다. 평균이면 평균, 합계면 합계로 말이죠. 소숫점이 길어진 것도 평균에서 평균을 잡으니 한 columns의 소숫점 길이가 길어졌기 때문입니다.

한 column에 대해서도 margins는 적용이 됩니다.

이번에는 두 개로 나눠진 values에 각각 aggfunc를 적용한 것입니다. 하나는 크기(len)를 하나는 합계(sum)를 적용한 것입니다.

이번에는 두 개의 values에 하나는 크기(len)만 적용했지만, Price에는 np.sumnp.mean 이렇게 두 함수를 적용한 경우를 보여주고 있습니다.

query를 이용해서 조건문을 적용해 볼 수 있다는 것을 위 그림에서 보여주고 있습니다.

이번에는 예제를 바꾸어서 위 그림과 같이 뭔가 군 부대에서 한 일종의 테스트 결과지인 모양입니다.

그걸 groupby라는 기능을 company에 적용하면 위 그림처럼 company별로 나눠서 항목을 잡아줍니다.

위 그림처럼 .groupby를 적용하고 describle()을 보면 각각 따로 적용되어있다는 것을 알 수 있습니다.

groupby는 두 개 이상의 항목에 대해서도 적용이 가능합니다.

그리고, .unstack()함수를 사용하면 위 그림처럼 indexcolumn으로 분리가 됩니다.

위와 같이 groupby가 적용된 후 평균(mean)을 바로 적용해 볼 수 있습니다.

혹은 데이터의 길이를 물어볼 수 있구요....

아~ groupby로 묶은 결과물은 print해도 내용이 나타나지 않는데요... 그래서 위와 같이 print를 해주어야 합니다.

그리고, mean을 적용하는데, column name 앞에 살짝 글자를 add_prefix명령으로 추가할 수 있습니다.

pd.cut 명령으로 지정된 구간(bins)에 해당 항목이 있는지 표기할 수 있구요.

이를 이용해서 labels 옵션을 적용해서 평점을 기록해 둘 수 있습니다.

groupby를 적용할 때, 여러 결과를 한 번에 return 되도록 해서 .apply().unstack()으로 위와 같은 표를 한 번에 얻을 수 있습니다.

이번엔 또 다른 데이터를 한 번 볼까요^^

위와 같이 되는 건 아까 보았구요^^

또 위 데이터로도 한 번 볼께요~~ 동일 데이터지만, State가 추가 되었네요...

부가적 평균.. 혹은 가중치 평균이라고 해서 weighted average 함수입니다. 단, 0으로 나누는 경우가 없도록 try - except 구문으로 에러 처리를 하고 있구요.

그러면 위와 같은 결과를 얻을 수 있지요^^

또, 하나.. 팁은 위와 같이 column 이름과 적용할 함수를 dict 형으로 선언해서 agg()를 통해 바로 groupby에 적용할 수 있습니다.

참 pandas는 잘 만들어진 아이인듯 합니다.^^

아~ 하나더... 위 그림처럼 바로~ 그래프 적용도 가능합니다. barh로 수평 바 그래프를 각 항목이 누적되도록 stacked=True로 표현한 것입니다.

반응형