본문 바로가기
Programming/Python

[Pandas] pivot_table, groupby로 데이터 통계 다루기

pivot()에서 함수가 들어가야하는 경우 pivot_table을 사용해야한다.

[구조]  

pd.pivot_table(데이터프레임, index=인덱스, columns=컬럼, values=집계할데이터, aggfunc=통계함수)
aggrunc의 디폴트는 mean

 

 

 

이와 같은 데이터 표 예제에 대해서

 

 

 

[잠깐 note]

fill_value = 0 <- pivot table중 하나의 옵션. float입력시 null있는 곳만 float

                         나머진 int로 변환

fillna(0)  <- 함수. 원본을 건드리지않고 null 대체값 입력한것으로 type 보존

 

 

 

# item, size별 재고 합계
df.pivot_table(index='item', columns='size', values='inventory', aggfunc='sum')

# [item,color], size별 재고 합계
df.pivot_table(index=['item','color'], columns='size', values='inventory', aggfunc='sum')

 

# null값은 0으로 처리
df.pivot_table(index=['item','color'], columns='size', 
               values='inventory', 
               aggfunc='sum', fill_value=0)

 

# [item,color], size별 판매,재고 합계
df.pivot_table(index=['item','color'], 
              columns='size', 
              values=['sale','inventory'], 
              aggfunc='sum', 
              fill_value=0)

 

 

 

[문제풀이 예제]

aggfunc = 'size'    <- value 지정 따로 없이도 알아서 각 종목별로 세주는 함수

fill_value=0           <- null 값 처리

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[타이타닉 성별, 객실등급별 생존분석 예제]

기본 데이터에 대한 정보

 

Survived = 0 : 죽음

Survived = 1 : 생존

 

 

 

 

 

 

 

 

 

 

 

 

 

성별, 객실등급별 승선자 수 -> count함수로 전체 count

df_titanic.pivot_table(index='Sex',
                       columns='Pclass',
                       values='Survived',
                       aggfunc='count',  #<-여기에 지정
                       margins=True)

margins = True: 그룹별 부분합, 총합계 표시 여부

 

 

성별, 객실등급별 생존자 수 -> sum으로 특정 조건만 sum 유도.

df_titanic.pivot_table(index='Sex',
                       columns='Pclass',
                       values='Survived', #생존자로 한정
                       aggfunc='sum', 
                       margins=True)

 

성별, 객실등급별 생존율 -> survived value 해당 구간 전체 평균값 (mean)

 

df_titanic.pivot_table(index='Sex',
                      columns='Pclass',
                      values='Survived',
                      aggfunc='mean',  #<-이게 default라서 생략 可
                      margins=True)

aggfunc 생략은 default로 mean 함수 실행. 따라서

df_titanic.pivot_table(index='Sex',columns='Pclass',values='Survived', margins=True)

이와 같이 생략한 코드도 동일한 결과물 출력.


 

 

 

 

 

  • df.groupby(그룹기준컬럼).통계적용컬럼.통계함수
  • count() : 누락값을 제외한 데이터 수
  • size() : 누락값을 포함한 데이터 수
  • mean() : 평균
  • sum() : 합계
  • std() : 표준편차
  • min() : 최소값
  • max() : 최대값
  • sum() : 전체 합

 

 

 

count 사용

 

 

 

 

 

 

 

sum 사용

 

 

 

 

 

 

 

mean 사용

 

 

 

 

 

 

위 3개를 정리해서 합치기

df.columns로 컬럼이름 변경

 

 

 

 

 

 

 

 

 

 

 


  • 데이터프레임.groupby(그룹기준컬럼).groups --> 그룹별 인덱스:[데이터리스트] 출력
  • 데이터프레임.groupby(그룹기준컬럼).get_group(그룹인덱스) --> 그룹별 인덱스에 해당하는 데이터프레임 출력

 

 

 

 

 

 

[문제풀이]

 

의도는 문제를 따라갔지만 출력이 다르게 나오는 서로 다른 두 코드를 비교해보자.
인덱스를 없애주는 unstack()를 유념하자.

 

데이터중 neighbourhood_group 값이 Queens값을 가지는 데이터들 중 neighbourhood 그룹별로 price값의 평균, 분산, 최대, 최소값을 구하라

 

df[df['neighbourhood_group']=="Queens"].groupby(['neighbourhood']).price.agg(['mean','var','max','min'])

df로 기존에 배운 특정조건 뽑아내기를 섞는 문제이다.

 

 

데이터중 neighbourhood_group 값에 따른 room_type 컬럼의 숫자를 구하고 neighbourhood_group 값을 기준으로 각 값의 비율을 구하여라

Ans = df[['neighbourhood_group','room_type']].groupby(['neighbourhood_group','room_type']).size().unstack()
Ans.loc[:,:] = (Ans.values /Ans.sum(axis=1).values.reshape(-1,1))
Ans

코드 상세 설명>>

Ans.loc[:,:] = (Ans.values /Ans.sum(axis=1).values.reshape(-1,1))

loc[: , :]  <- 전체 선택.

Ans.values          -> 표의 숫자값만 행렬로 출력  mtx(5*3)

Ans.sum(axis=1)  -> 1열 5행으로 각 행의 합 mtx(5*1) 출력 

reshape(-1,1)         <- numpy 함수.  행렬 형태 변형  서로 연산되게끔 변형 (5*3mtx  1*5mtx)

 

728x90
반응형