예전에 Python pandas에 대한 이야기를 했었는데요. 그때 빼먹고 하지 않은 (많은~~) 것들 중에 보강차원에서 오늘은 pivot_table과 groupby에 대해 이야기를 할려고 합니다. 이 글의 자료는 모두 [바로가기]에 있는 자료들이며, 그 예제들 중 일부를 따라하는 겁니다.^^
- Python Pandas
- 기초스러운 Series 사용법
- Python Pandas
- 기초스러운 DataFrame 사용법
- Python Pandas
- Python pandas를 이용한 저장된 파일에서 읽은 데이터를 쉽게 사용하기
- Python Pandas
- Python Pandas를 이용해 분석한 데이터를 그래프로 표현하기...
- Python Pandas
- Pandas pivot_table과 groupby, cut 사용하기
매니저나 도매상별 매출 집계 데이터입니다. 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.sum
과 np.mean
이렇게 두 함수를 적용한 경우를 보여주고 있습니다.
또 query
를 이용해서 조건문을 적용해 볼 수 있다는 것을 위 그림에서 보여주고 있습니다.
이번에는 예제를 바꾸어서 위 그림과 같이 뭔가 군 부대에서 한 일종의 테스트 결과지인 모양입니다.
그걸 groupby
라는 기능을 company에 적용하면 위 그림처럼 company별로 나눠서 항목을 잡아줍니다.
위 그림처럼 .groupby
를 적용하고 describle()
을 보면 각각 따로 적용되어있다는 것을 알 수 있습니다.
groupby
는 두 개 이상의 항목에 대해서도 적용이 가능합니다.
그리고, .unstack()
함수를 사용하면 위 그림처럼 index
와 column
으로 분리가 됩니다.
위와 같이 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
로 표현한 것입니다.
'Software > Python' 카테고리의 다른 글
[Seaborn 연재] heatmap 사용하기 (2) | 2017.01.20 |
---|---|
[Seaborn 연재] lmplot과 kdeplot, distplot (8) | 2017.01.19 |
[Seaborn 연재] set_style과 boxplot, swarmplot (4) | 2017.01.18 |
MATPLOTLIB 응용 이쁜~ 그래프들~^^ (14) | 2017.01.03 |
MATPLOTLIB 히스토그램과 박스플롯 Boxplot (16) | 2016.12.30 |
MATPLOTLIB subplot 사용해보기 (8) | 2016.12.29 |
MATPLOTLIB scatter, bar, barh, pie 그래프 그리기 (8) | 2016.12.27 |