본문 바로가기

코딩/머신러닝&데이터 분석 강의

[머신러닝 인강] 13-2주차: Pandas DataFrame의 그룹핑 (group by, transform, pivot, pivot_table)

<13-2주차 수강 클립>

04. 데이터 분석을 위한 Python (Pandas)

20. DataFrame의 그룹핑 - 01. DataFrame group by 이해하기

21. DataFrame의 그룹핑 - 02. transform 함수의 이해 및 활용하기

22. DataFrame의 그룹핑 - 03. pivot, pivot_table 함수의 이해 및 활용하기

 


 

이번 주차는 DataFrame의 그룹핑에 대해서 배워보는 시간이었습니다.

그룹핑이란 특정 column(feature, 변수)에 대해서

데이터를 묶어 처리를 하는 작업을 말합니다 !

>>수강 인증샷<<

 


 

20. DataFrame의 그룹핑 - 01. DataFrame group by 이해하기

 

- group by

명시한 특정 column에 대해서 데이터를 묶어 데이터의 처리를 하는 작업 (집계, 집합 함수를 이용해 그룹별로 집계하는 작업을 위함)

다음의 세 단계를 적용해 데이터를 그룹화(groupping)

1. 데이터 분할

2. operation 적용

3. 데이터 병합

import pandas as pd

# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
df = pd.read_csv('csv데이터가 있는 경로')
df.head()
class_group = df.groupby('Pclass')
class_group

: 명시한 column에 대해서 데이터를 그룹핑함

 

 

 

- GroupBy groups 속성

각 그룹과 그룹에 속한 index를 dict 형태로 표현

class_group.groups

: dict 출력

: key: 'Pclass' column에 들어있는 각 값 ('1등석', '2등석', '3등석'에 해당하는 1, 2, 3)

: value: key에 해당하는 값을 가지는 데이터의 index

 

 

 

gender_group = df.groupby('Sex')
gender_group.groups

: key: '여성', '남성'에 해당하는 'female', 'male'

 

 

- groupping 함수

그룹 데이터(groupby로 묶은 데이터)에 적용 가능한 통계 함수 (NaN은 제외하여 연산)

count: 데이터 개수

sum: 데이터의 합

mean, std, var - 평균, 표준편차, 분산 값

min, max - 최소, 최댓값

class_group.count()

: groupby의 기준이 되는 column(예시에서는 'Pclass')을 기준으로 그룹을 나눴을 때, 해당 기준 column을 바탕으로 집계를 내린 것 (해당되는 데이터의 개수를 카운팅)

: 집계를 낸 새로운 DataFrame 반환

: index:기준 column

: column: 기준이 된 column 제외 나머지 column

 

 

 

class_group.mean()['Age']

: Pclass별 나이 평균

 

 

 

class_group.mean()['Survived']

: 생존이면 1, 사망이면 0 → 생존률이라고 해석할 수 있음

: Pclass별 전체 승객 대비 살아남은 사람들의 비율(=생존률)

 

 

 

class_group.min()

: Pclass별 각 feature에서의 최솟값

 

 

 

 

df.groupby('Sex').mean()['Survived']

: 성별에 따른 생존률

 

 

 

- 복수 columns로 groupping 하기

groupby에 column 리스트를 전달

통계함수(grouping함수)를 적용한 결과는 multiindex를 갖는 dataframe

 

예제) 클래스와 성별에 따른 생존률 구해보기

df.groupby(['Pclass', 'Sex']).mean()

 

 

 

 

df.groupby(['Pclass', 'Sex']).mean().index

: MultiIndex를 반환 (list in list)

 

 

 

df.groupby(['Pclass', 'Sex']).mean().loc[[2, 'female']]

: loc는 []와 함께 사용하며, []안에는 행의 사용자 정의 index가 들어감

: 복수 개의 index는 다시 리스트([])로 묶어 전달 (indexing을 나타내는 [ ] 기호 + 리스트 나타내는 [ ])

: 반환 타입 DataFrame

 

 

 

df.groupby(['Pclass', 'Sex']).mean().loc[(2, 'female')]

: 복수 개의 index를 전달할 때 loc[ ] 안에 [리스트] 대신 ( )로 주면 반환 타입 Series

 

 

 

df.groupby(['Pclass', 'Sex']).mean()['Survived']

: 클래스, 성별에 따른 생존률

 

 

 

- index를 이용한 groupby

index가 있는 경우, groupby 함수에 level 사용 가능

*) level: index의 depth를 의미하며, 가장 왼쪽부터 0부터 증가

  • set_index 함수: column 데이터를 index 레벨로 변경
  • reset_index 함수: 인덱스 초기화
df.head()

: 기존 DataFrame은 index가 0-based의 range index임 (사용자 정의 index가 x)

 

 

 

df.set_index('Pclass')

: 새로운 index로 세팅 → Pclass column이 index 레벨로 내려옴 (새로운 사용자 인덱스로!)

 

 

 

df.set_index(['Pclass', 'Sex'])

: 복수 개의 column을 set_index 함수에 전달 → multi index로 내려감

 

 

 

df.set_index(['Pclass', 'Sex']).reset_index()

: 모든 인덱스 설정 다시 초기화

 

 

 

df.set_index('Age').groupby(level=0).mean()

: level=0 의 뜻: Age가 'level 0'의 index로 setting됐으므로 'Age를 기준으로 groupping을 하라'는 뜻

: multiindex일 때 가장 왼쪽 인덱스부터 level이 0, 1, 2, ... 로 메겨짐

 

 

 

- 나이대별로 생존율 구하기

import math
def age_categorize(age):
    if math.isnan(age):
        return -1
    return math.floor(age / 10) * 10

: 10대, 20대, 30대 ... 로 나이 분류하기

 

 

 

df.set_index('Age').groupby(age_categorize).mean()

: groupby의 입력값으로 전달한 함수 → Age 인덱스에 적용, 인덱스 값이 변환 함수에 따라 바뀜

: 바뀐 인덱스 값을 기준으로 평균값 구함

 

 

 

- MultiIndex를 이용한 groupping

df.set_index(['Pclass', 'Sex']).groupby(level=[0, 1]).mean()

: level을 줄 때 Multi index를 기준으로 grouping 하고싶다면 리스트로 넘겨주기

: 왼쪽부터 Pclass(level 0), Sex(level 1)

 

 

 

- aggregate(집계) 함수 사용하기

groupby 결과에 집계함수를 적용하여 그룹별 데이터 확인 가능

각 column(feature, 변수)에 따라 column별 집계 결과를 하위 column으로 만들어 DataFrame 반환

그룹별 데이터를 한 번에 볼 수 있음

list형태로 집계함수 넘겨주기

df.set_index(['Pclass', 'Sex']).groupby(level=[0, 1])

: groupby 결과

 

 

 

df.set_index(['Pclass', 'Sex']).groupby(level=[0, 1]).aggregate([np.mean, np.sum, np.max])

: groupby 결과에 집계함수(aggregate) 적용

 

 

 


 

21. DataFrame의 그룹핑 - 02. transform 함수의 이해 및 활용하기

 

- transform 함수

기존에 groupby함수를 적용하면 DataFrame과 형태가 다른 복사본으로 출력됨 → row, column 개수 줄어듦

groupby 후 transform 함수를 사용하면 원본 dataframe의 index를 유지한 상태로 통계함수 적용

전체 데이터의 집계가 아닌 각 그룹에서의 집계를 계산

따라서 새로 생성된 데이터를 원본 df에 합치기 쉬움

df.groupby('Pclass').mean()

: Pclass column이 index 레벨로 내려옴

 

 

 

df.groupby('Pclass').transform(np.mean)

: index는 그대로, Pclass 값이 각각 1, 2, 3 일 때 각 column값들의 mean을 채워넣음

 

 

 

df['Age2'] = df.groupby('Pclass').transform(np.mean)['Age']

: 존재하는 데이터로 통계수치를 낸 결과를 다시 새로운 column으로 만들어 원본 df에 추가하고 싶을 때 transform을 사용하면 df의 구조가 바뀌지 x

: 바로 df['새로운 column']에 대입하여 새 column을 추가할 수 있음

 

 

 

df.groupby(['Pclass', 'Sex']).mean()

: multiindex로 groupping

 

 

 

df['Age3'] = df.groupby(['Pclass', 'Sex']).transform(np.mean)['Age']

: groupby 결과에 원본 df의 인덱스에 맞도록 transform통계함수 적용 & 그 중 'Age' column을 선택한 것

 

 

 


 

22. DataFrame의 그룹핑 - 03. pivot, pivot_table 함수의 이해 및 활용하기

 

import numpy as np
import pandas as pd

df = pd.DataFrame({
    '지역': ['서울', '서울', '서울', '경기', '경기', '부산', '서울', '서울', '부산', '경기', '경기', '경기'],
    '요일': ['월요일', '화요일', '수요일', '월요일', '화요일', '월요일', '목요일', '금요일', '화요일', '수요일', '목요일', '금요일'],
    '강수량': [100, 80, 1000, 200, 200, 100, 50, 100, 200, 100, 50, 100],
    '강수확률': [80, 70, 90, 10, 20, 30, 50, 90, 20, 80, 50, 10]
                  })

 

 

- pivot

dataframe의 형태를 변경

index, column, data 순서대로 사용할 컬럼을 명시 (명시하지 않으면 나머지 데이터들로 value들을 채움)

df.pivot('지역', '요일')

: 순서대로 index = '지역', column = '요일' 로 들어가고 나머지 column 값은은 data 파라미터로 모두 넘겨져 value로서 DF에 채워짐

 

 

 

df.pivot('요일', '지역', '강수량')

: 순서대로 index = '요일', column = '지역', data = '강수량' 으로 들어감 (data 파라미터로 넘겨진 column값만 value로서 채워짐)

 

 

 

 

df = pd.DataFrame({
    '지역': ['서울', '서울', '서울', '경기', '경기', '부산', '서울', '서울', '부산', '경기', '경기', '경기'],
    '요일': ['월요일', '월요일', '수요일', '월요일', '화요일', '월요일', '목요일', '금요일', '화요일', '수요일', '목요일', '금요일'],
    '강수량': [100, 80, 1000, 200, 200, 100, 50, 100, 200, 100, 50, 100],
    '강수확률': [80, 70, 90, 10, 20, 30, 50, 90, 20, 80, 50, 10]
                  })

: 인덱스 중복된 경우

 

 

 

#중복 허용 후 호출->인덱스 중복 에러
df.pivot('요일', '지역')

: 인덱스 중복 에러 (서울 - 월요일 데이터에 중복되는 값 두 개가 존재)

 

 

 

- pivot_table

기능적으로 pivot과 동일

pivot과의 차이점: 중복되는 모호한 값이 있을 경우, aggregation 함수 사용하여 값을 채움 (aggfunc 파라미터에 변형 로직 함수 전달)

pd.pivot_table(df, index='요일', columns='지역', aggfunc=np.mean)

: 파라미터 순서대로: pd.DataFrame, index로 사용할 column, columns로 사용할 column, data로 사용할 column(없을 경우 남은 column들로 채워넣음), aggfun에 변형 로직의 함수 전달

: 서울-월요일 위치의 값이 2개로 중복되는 상황 → 에러 발생시키지 않고 두 값의 mean으로 값을 채움

 

 


 

강의 링크: https://bit.ly/3cB3C8y

반응형