pandas는 데이터를 그룹 별로 분류하는 groupby 메소드가 있으며 특정 열, 열의 리스트 또는 행 인덱스를 기준으로 그룹화를 진행
groupby 연산결과로 GroupBy 객체를 반환하는 것이 특징이며, 이 객체에는 그룹연산 메소드가 내장되어 있음
범주별 특징을 나타낼 수 있음

count: 개수
sum: 합
mean,median: 평균값 중앙값
min,max: 최소값 최대값
var,std: 분산 표준편차
first,last: 첫번째 값 마지막 값
Describe: 기술통계량
aggregateoragg: 사용자 정의 함수와 메소드로 데이터에 적용
apply: 사용자 정의 함수와 메소드로 데이터에 적용
grouped.apply(함수) : 사용자 지정 함수 사용 가능, lambda식 자주 쓰이는 것이 특징
GroupBy 객체 그룹 별 반복 작업 방식과 특징
- 반복문을 이용할 수 있음
- 그룹 이름과 그룹별 데이터로 튜플 형태로 갖고 있음
- 각 그룹별 데이터는 원래의 인덱스 값을 갖고 있음
sort_values함수를 이용하면 데이터를 정렬할 수 있음 내림차순 ascending=Falseimport 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
#학과별 우수 성적자 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)