<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
'코딩 > 머신러닝&데이터 분석 강의' 카테고리의 다른 글
[머신러닝 인강] 14-1주차: Pandas DataFrame의 병합 (stack, unstack, Concat, Merge, join) (0) | 2021.08.31 |
---|---|
[머신러닝 인강] 패스트캠퍼스 머신러닝과 데이터 분석 A-Z올인원 패키지 Online 머신러닝 인강 챌린지 참여 후기 (0) | 2021.05.24 |
[머신러닝 인강] 13-1주차: Pandas DataFrame 숫자 데이터, 범주형 데이터, 데이터의 전처리 (0) | 2021.05.10 |
[머신러닝 인강] 12-2주차: Pandas DataFrame 새 컬럼 추가/삭제, 상관관계 계산, NaN 데이터 처리 (0) | 2021.05.09 |
[머신러닝 인강] 12-1주차: Pandas DataFrame 의 컬럼,데이터 선택하기 (0) | 2021.05.08 |