[Python 100일 챌린지] Day 66 - Pandas 그룹화와 집계
[Python 100일 챌린지] Day 66 - Pandas 그룹화와 집계
엑셀의 피벗 테이블을 Python으로! 📊
데이터를 그룹별로 나누고, 합계/평균을 구하고… groupby() 하나면 복잡한 분석도 쉽게! 실무에서 정말 많이 쓰이는 기능이에요! 💪
(30분 완독 ⭐⭐)
🎯 오늘의 학습 목표
📚 사전 지식
- Day 63: Pandas 기초 - DataFrame 기본
- Day 65: Pandas 데이터 조작 - 필터링, 정렬
🎯 학습 목표 1: groupby() 기초 익히기
1.1 그룹화란?
1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
# 샘플 데이터
df = pd.DataFrame({
'부서': ['영업', '개발', '영업', '개발', '영업', '개발'],
'이름': ['철수', '영희', '민수', '지영', '현수', '수진'],
'월급': [300, 400, 350, 450, 320, 420],
'연차': [3, 5, 2, 7, 4, 3]
})
print(df)
출력:
1
2
3
4
5
6
7
부서 이름 월급 연차
0 영업 철수 300 3
1 개발 영희 400 5
2 영업 민수 350 2
3 개발 지영 450 7
4 영업 현수 320 4
5 개발 수진 420 3
1.2 기본 groupby()
1
2
3
4
5
# 부서별 그룹화
grouped = df.groupby('부서')
# 부서별 평균 월급
print(grouped['월급'].mean())
출력:
1
2
3
4
부서
개발 423.333333
영업 323.333333
Name: 월급, dtype: float64
1.3 여러 집계 한 번에
1
2
# 부서별 모든 숫자 컬럼 평균
print(df.groupby('부서').mean())
출력:
1
2
3
4
월급 연차
부서
개발 423.33 5.00
영업 323.33 3.00
🎯 학습 목표 2: 다양한 집계 함수 사용하기
2.1 기본 집계 함수들
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
df = pd.DataFrame({
'부서': ['영업', '개발', '영업', '개발', '영업'],
'월급': [300, 400, 350, 450, 320]
})
grouped = df.groupby('부서')['월급']
print("합계:", grouped.sum().to_dict())
print("평균:", grouped.mean().to_dict())
print("최대:", grouped.max().to_dict())
print("최소:", grouped.min().to_dict())
print("개수:", grouped.count().to_dict())
2.2 agg()로 여러 함수 적용
1
2
3
4
5
6
7
8
9
10
import pandas as pd
df = pd.DataFrame({
'부서': ['영업', '개발', '영업', '개발', '영업'],
'월급': [300, 400, 350, 450, 320]
})
# 여러 집계 함수 동시에
result = df.groupby('부서')['월급'].agg(['sum', 'mean', 'max', 'min'])
print(result)
출력:
1
2
3
4
sum mean max min
부서
개발 850 425.0 450 400
영업 970 323.3 350 300
2.3 열마다 다른 집계
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
df = pd.DataFrame({
'부서': ['영업', '개발', '영업', '개발', '영업'],
'월급': [300, 400, 350, 450, 320],
'연차': [3, 5, 2, 7, 4]
})
# 열마다 다른 함수 적용
result = df.groupby('부서').agg({
'월급': 'mean', # 평균
'연차': 'max' # 최대값
})
print(result)
출력:
1
2
3
4
월급 연차
부서
개발 425.0 7
영업 323.3 4
🎯 학습 목표 3: 다중 그룹화와 피벗 테이블
3.1 다중 컬럼 그룹화
1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
df = pd.DataFrame({
'부서': ['영업', '영업', '개발', '개발', '영업', '개발'],
'직급': ['사원', '대리', '사원', '대리', '사원', '대리'],
'월급': [300, 400, 350, 500, 320, 480]
})
# 부서 + 직급별 그룹화
result = df.groupby(['부서', '직급'])['월급'].mean()
print(result)
출력:
1
2
3
4
5
6
부서 직급
개발 대리 490.0
사원 350.0
영업 대리 400.0
사원 310.0
Name: 월급, dtype: float64
3.2 피벗 테이블
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd
df = pd.DataFrame({
'부서': ['영업', '영업', '개발', '개발', '영업', '개발'],
'직급': ['사원', '대리', '사원', '대리', '사원', '대리'],
'월급': [300, 400, 350, 500, 320, 480]
})
# 엑셀 피벗 테이블처럼!
pivot = pd.pivot_table(df,
values='월급', # 값
index='부서', # 행
columns='직급', # 열
aggfunc='mean' # 집계 함수
)
print(pivot)
출력:
1
2
3
4
직급 대리 사원
부서
개발 490.0 350.0
영업 400.0 310.0
3.3 피벗 테이블 활용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
df = pd.DataFrame({
'부서': ['영업', '영업', '개발', '개발', '영업', '개발'],
'직급': ['사원', '대리', '사원', '대리', '사원', '대리'],
'월급': [300, 400, 350, 500, 320, 480],
'성과': [85, 90, 88, 95, 82, 92]
})
# 여러 값, 여러 집계
pivot = pd.pivot_table(df,
values=['월급', '성과'],
index='부서',
columns='직급',
aggfunc={'월급': 'mean', '성과': 'max'}
)
print(pivot)
🎯 학습 목표 4: 실전 데이터 분석 예제
4.1 판매 데이터 분석
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pandas as pd
# 판매 데이터
sales = pd.DataFrame({
'날짜': ['2024-01', '2024-01', '2024-02', '2024-02', '2024-01', '2024-02'],
'제품': ['A', 'B', 'A', 'B', 'A', 'B'],
'지역': ['서울', '서울', '서울', '부산', '부산', '부산'],
'판매량': [100, 150, 120, 80, 90, 200],
'매출': [1000, 2250, 1200, 1200, 900, 3000]
})
# 1. 월별 총 매출
monthly = sales.groupby('날짜')['매출'].sum()
print("=== 월별 매출 ===")
print(monthly)
# 2. 제품별 평균 판매량
product = sales.groupby('제품')['판매량'].mean()
print("\n=== 제품별 평균 판매량 ===")
print(product)
# 3. 지역-제품별 매출
pivot = pd.pivot_table(sales,
values='매출',
index='지역',
columns='제품',
aggfunc='sum'
)
print("\n=== 지역-제품별 매출 ===")
print(pivot)
4.2 성적 데이터 분석
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pandas as pd
# 학생 성적
scores = pd.DataFrame({
'학년': [1, 1, 1, 2, 2, 2, 3, 3, 3],
'반': ['A', 'A', 'B', 'A', 'B', 'B', 'A', 'A', 'B'],
'이름': ['철수', '영희', '민수', '지영', '현수', '수진', '동훈', '미나', '준호'],
'국어': [85, 90, 78, 92, 88, 76, 95, 89, 82],
'수학': [90, 85, 82, 88, 75, 80, 92, 87, 78]
})
# 학년별 평균
print("=== 학년별 평균 ===")
print(scores.groupby('학년')[['국어', '수학']].mean())
# 학년-반별 국어 평균
print("\n=== 학년-반별 국어 평균 ===")
print(scores.groupby(['학년', '반'])['국어'].mean())
💡 실전 팁
✅ 자주 쓰는 패턴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd
df = pd.DataFrame({
'그룹': ['A', 'A', 'B', 'B'],
'값': [10, 20, 30, 40]
})
# 그룹별 상위 N개
# df.groupby('그룹').head(2)
# 그룹별 정렬
df.sort_values(['그룹', '값'], ascending=[True, False])
# 그룹 크기
print(df.groupby('그룹').size())
🧪 연습 문제
문제: 직원 데이터 분석
주어진 데이터에서 1) 부서별 평균 급여, 2) 부서-직급별 인원 수, 3) 부서별 최고 급여자 찾기
1
2
3
4
5
6
employees = pd.DataFrame({
'이름': ['김철수', '이영희', '박민수', '최지영', '정현수', '강수진'],
'부서': ['영업', '개발', '영업', '개발', '영업', '개발'],
'직급': ['사원', '대리', '대리', '과장', '사원', '사원'],
'급여': [3000, 4500, 4000, 5500, 3200, 4000]
})
✅ 정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd
employees = pd.DataFrame({
'이름': ['김철수', '이영희', '박민수', '최지영', '정현수', '강수진'],
'부서': ['영업', '개발', '영업', '개발', '영업', '개발'],
'직급': ['사원', '대리', '대리', '과장', '사원', '사원'],
'급여': [3000, 4500, 4000, 5500, 3200, 4000]
})
# 1. 부서별 평균 급여
print("=== 부서별 평균 급여 ===")
print(employees.groupby('부서')['급여'].mean())
# 2. 부서-직급별 인원 수
print("\n=== 부서-직급별 인원 수 ===")
print(employees.groupby(['부서', '직급']).size())
# 3. 부서별 최고 급여자
print("\n=== 부서별 최고 급여자 ===")
idx = employees.groupby('부서')['급여'].idxmax()
print(employees.loc[idx])
📝 오늘 배운 내용 정리
- groupby():
df.groupby('컬럼')- 그룹별 분석 - 집계 함수:
sum(),mean(),max(),min(),count() - agg(): 여러 집계 함수 동시 적용
- pivot_table(): 엑셀 피벗 테이블처럼 분석
📚 이전 학습
Day 65: Pandas 데이터 조작 ⭐⭐
📚 다음 학습
Day 67: Matplotlib 기초 ⭐⭐
“그룹화와 집계는 데이터 분석의 핵심이에요!” 📊
Day 66/100 Phase 7: 데이터 분석 기초 #100DaysOfPython
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
