데이터 그룹화 - groupby

hisungmi·2024년 8월 14일
0

KT Aivle

목록 보기
7/23
post-thumbnail

데이터 그룹화

  • 특정 데이터 그룹의 특징에 관한 정보를 얻기 위함

pandas를 이용한 그룹화

  • pandas는 데이터를 그룹 별로 분류하는 groupby 메소드가 있으며 특정 열, 열의 리스트 또는 행 인덱스를 기준으로 그룹화를 진행

    groupby 연산결과로 GroupBy 객체를 반환하는 것이 특징이며, 이 객체에는 그룹연산 메소드가 내장되어 있음

  • 범주별 특징을 나타낼 수 있음

GroupBy의 집계함수

count : 개수
sum : 합
mean, median : 평균값 중앙값
min, max : 최소값 최대값
var, std : 분산 표준편차
first, last : 첫번째 값 마지막 값
Describe : 기술통계량
aggregate or agg : 사용자 정의 함수와 메소드로 데이터에 적용
apply : 사용자 정의 함수와 메소드로 데이터에 적용

GroupBy의 apply

  • GroupBy 객체의 apply 함수로 그룹별 다양한 연산 가능

    grouped.apply(함수) : 사용자 지정 함수 사용 가능, lambda식 자주 쓰이는 것이 특징

그룹별 반복 작업

GroupBy 객체 그룹 별 반복 작업 방식과 특징

  • 반복문을 이용할 수 있음
  • 그룹 이름과 그룹별 데이터로 튜플 형태로 갖고 있음
  • 각 그룹별 데이터는 원래의 인덱스 값을 갖고 있음

데이터 정렬

  • Pandas의 Series나 DataFrame의 sort_values함수를 이용하면 데이터를 정렬할 수 있음 내림차순 ascending=False

groupby 함수

import numpy as np
import pandas as pd

학과 기준 그룹화

#데이터프레임 생성
df = pd.DataFrame({ ~~ })

#데이터프레임 학과 기준으로 그룹화
df_dept = df.groupby('학과')

#학과별 기술 통계 출력
df_dept.describe() 
#학과별 원소 개수 출력
df_defp.count()

1단계 그룹핑

#Series 에 대한 1단계 그룹핑
dept = df['학점'].groupby(df['학과'])
print(dept)

#학과 평균 성적 출력
dept.mean()
#학과 성적 표준편차
dept.std()
#그룹별 크기
group_size = dept.size()

#수학과 인원데이터만 따로 출력
math = dept.get_group('수학') #get_group(인덱스명) 사용

2단계 그룹핑

#학과, 학년으로 그룹화
dept = df.groupby([df['학과'], df['학년']])
dept

#그룹별 정보 도출
dept.describe()
#그룹 평균값 도출
display(dept.mean())

새로운 데이터프레임 생성

#df1과 df2 행방향 연결
concat_df = pd.concat([df, df2], axis=0)
concat_df.reset_index(inplace=True, drop=True)
display(concat_df)

#학과, 학년별로 그룹핑
dept_and_year = concat_df.groupby([concat_df['학과'], concat_df['학년']])
#학과, 학년 별 기술 통계 출력
dept_and_year.describe()
#그룹별 평균
dept_and_year.mean()
#2단계 그룹화 인덱스 확인
dept_and_year.mean().index

apply 함수

#학과별 우수 성적자 3명 출력 함수
def top3_Dept_scorer(df):
	return df.sort_values(by='학점', ascending=False)[:3]
    
#학과 그룹바이 객체 생성
dept = concat_df.groupby('학과')
#apply와 top3 함수
dept.apply(top3_dept_scorer)

#학과 최우수 2명 출력하는 함수
def top2_scorer(series):
	return series.sort_values(ascending=False)[:2]
    
dept['학점'].apply(top2_scorer)

#멀티인덱스의 경우 데이터 프레임으로 보면 정렬된 뷰를 볼 수 있음
pd.DataFrame(dept['학점'].apply(top2_scorer))

lambda식 활용

#데이터프레임 생성
df = pd.DataFrame({ ~~ })

#key 별로 그룹화후 오름차순
df.groupby('key').apply(lambda x: x.sort_values(by='data'))
#위에서 apply함수를 이용하여 진행한 학과별 성적 탑 3명 학생 출력을 lambda식으로 진행
dept = concat_df.groupby('학과')
dept.apply(lambda x: x.sort_values(by='학점', ascending=False)[:3])

groupdy와 재귀함수

#1차 그룹핑 재귀
for dept, group in concat_df.groupby(concat_df['학과']):
	print('학과: {}'.format(dept))
    display(group)

#2차 그룹핑 재귀
for (dept, year), group in concat_df.groupby([concat_df['학과'], concat_df['학년']]):
	print(dept, year)
    display(group)
    
profile
난 성미다.

0개의 댓글