본문 바로가기
Data Science

[pandas.pivot_table] 피봇테이블, 개꿀.

by 루크 Luke 2021. 10. 13.
반응형

pandas.pivot_table

- pandas 피봇테이블은 크게 index, columns, values, aggfunc으로 구성된다.

- 피봇테이블을 그려 볼 데이터를 가져왔다.

- pd.pivot_table() 로도 가능하지만, 해당 데이터프레임(df)이 있다면, df.pivot_table()로 만들 수 있다.

- 피봇테이블을 만들었을 때, 숫자데이터만 취합된다. 문자로 된 것들은 보여주지 않는다.

- 인덱스 설정은, index="인덱스"로 한다.

df.pivot_table(index="name")

값을 지정하지 않았다면, 값은 평균이 디폴트다.

- 멀티 인덱스도 가능하다. 2개 이상의 인덱스를 넣을 때는 리스트로 감싸서 넣어주면 된다.

df.pivot_table(index=["Name", "Rep", "Manager"])

- values 설정은 values=""의 형태로 해주면 된다.

- values를 지정하면 평균이 아니라 그 값 그대로가 출력된다.

- 함수는 보통 리스트로 넣고, ""는 쓰지 않는다.

df.pivot_table(index=["Manager", "Rep"], values="price", aggfunc=[np.sum, len])

- Columns까지 지정하고, 약간의 서식을 더 지정하려고 한다.

- 값이 없는 경우에는 fill_value=0을 코딩해서 0으로 출력되도록 한다.

- 엑셀의 부분합 기능과 비슷하게, 피봇테이블의 각 요소들의 부분합을 표시하기 위해서, margins=True

# 아래로 내려서 기재할 때는, 꼭 콤마(,) 잊지말자.
df.pivot_table(
	index=["Manager", "Rep"], 
    columns="Product",
    values=["Price", "Quantity"],
    aggfunc=np.sum,
    fill_value=0,
    margins=True
)

- 기본적으로 이 정도만 숙지하고 우리 데이터로 피봇 테이블을 만들어본다.

 

피봇테이블 만들기 전에 데이터 준비하기

- 시민들에게 오픈되어 있는 유용한 공공데이터들이 많다.

- 보통 그런 데이터들은 분석 이전에 NaN 값이나 불필요한 것들을 제거하는 작업들이 필요하다.

- 우리도 서울시 범죄 현황 데이터(공공 데이터)를 공유 받아서 해당 작업을 해봤다.

- 일단 pandas, numpy 모듈을 임포트한다.

import pandas as pd
import numpy as np

- 그리고 해당 데이터(csv)를 Jupyter notebook으로 읽는다.

# encoding="cp949"에서 euc-kr로 적용해도 된다.
# thousand는 천 단위의 콤마를 제거해주려고 쓴다. - 나중에 발견하면 귀찮아진다.
crime_raw_data = pd.read_csv("../ds_study/data/02._crime_in_Seoul.csv", thousand=",", encoding="cp949")

- 데이터프레임의 정보를 보기 위해 .info()를 활용했다.

인덱스는 65534까지 있는데, non-null값이 310개이다. 이상하다.

- 범죄현황과 관련한 데이터이기 때문에, '죄종' 기준으로 보기로 한다.

- 죄종이 모든 인덱스에 들어 있는지 유니크(.unique())로 확인해보려고 한다.

crime_raw_data["죄종"].unique()

코딩 결과에서 NaN 값이 있는 것을 알 수 있다.

- 죄종에 NaN값을 없애주기 위해서, 다음과 같이 처리했다.

# 죄종이 not null 이냐 물어보는 .notnull()을 적용하면 boolean 값으로 나온다.
# boolean에 따라서 crime_raw_data를 볼 수 있다.
crime_raw_data = crime_raw_data[crime_raw_data["죄종"].notnull()]

 

서울시 범죄현황 데이터 - 피봇 테이블 만들기

정리한 데이터는 이렇게 생겼다.

- index를 구분, column을 죄종, 발생검거, aggfunc을 총합으로 지정해서 피봇테이블을 작성한다. (crime_station에 저장)

crime_station = crime_raw_data.pivot_table(
    	index="구분",
    	columns=["죄종","발생검거"],
    	aggfunc=np.sum
)

crime_station.head()

- 해당 피봇테이블의 상단 2줄은 쓸모가 없어보인다. droplevel을 활용해서 삭제한다.

crime_station.columns = crime_station.columns.droplevel([0,1]) #0, 1번 삭제

- 결과적으로 crime_station 피봇테이블은 다음과 같다.


시각화 넷째 날 후기

csv나 excel 파일을 그냥 불러와서 작업할 때,

가끔은 이렇게 정돈되지 않은 데이터가 올 수 있을텐데 어떻게 하지 생각했었던 적이 있었다.

피봇테이블을 활용하면 데이터를 깔끔하고 이해하기 쉽게 정리하기 좋을 것 같다.

 

 

- 네카라쿠배 데이터사이언스 오프라인 1기 수강 中

https://zero-base.co.kr/

 

제로베이스 - 밑바닥부터 끝까지 듣는 온라인 강의

무조건 간다! 개발자 스쿨 '네카라쿠배', 끝까지 공부하는 '온라인 완주반', 전문가가 베스트셀러를 해석해 주는 '한달한권' 등 교육 서비스로 삶의 전환점을 제공하는 제로베이스입니다.

zero-base.co.kr

 

반응형

댓글