Python의 pandas.groupby() 함수는 판다스 데이터프레임에서 데이터를 특정 열이나 조건에 따라 그룹화하여 분석하고 처리하는 강력한 도구입니다. 이는 마치 스프레드시트에서 피벗 테이블을 만드는 것과 유사한 개념으로, agg(), apply(), transform() 등의 메서드와 함께 사용됩니다.
이 함수는 대량의 데이터를 다룰 때 특히 유용하며, 데이터프레임을 논리적인 그룹으로 분류하여 각 그룹별 통계를 계산하거나 특정 패턴을 분석하는 데 효과적입니다. 데이터 분석과 전처리 과정에서 필수적인 도구로 자리잡고 있으며, 복잡한 데이터 구조를 더 의미 있고 관리하기 쉬운 형태로 변환하는 데 도움을 줍니다.
기본 사용법
pandas의 groupby() 함수는 데이터프레임을 특정 열을 기준으로 그룹화하고, 각 그룹에 대해 원하는 집계 연산을 수행할 수 있게 해줍니다. 기본적인 사용 방법은 데이터프레임에서 groupby() 메서드를 호출하고, 그룹화하고자 하는 열의 이름을 인자로 전달하는 것입니다. 이후 mean(), sum(), count() 등의 집계 함수를 연결하여 각 그룹별 통계값을 계산할 수 있습니다.
import pandas as pd
# 샘플 데이터프레임 생성
df = pd.DataFrame({
'부서': ['IT', 'IT', 'HR', 'HR', 'Finance'],
'이름': ['김철수', '이영희', '박지민', '최동욱', '정미나'],
'급여': [5000, 4500, 4000, 4200, 5500],
'근무년수': [3, 2, 4, 3, 5]
})
# 부서별 급여 평균 계산
result = df.groupby('부서')['급여'].mean()
print(result)
# 부서별 다중 통계 계산
result_multi = df.groupby('부서').agg({
'급여': ['mean', 'sum'],
'근무년수': ['min', 'max']
})
print(result_multi)
Python
복사
다양한 활용 예시
groupby() 함수는 다양한 방식으로 활용될 수 있습니다. 여기에는 다중 열 그룹화, 사용자 정의 함수 적용, transform()을 이용한 그룹 연산 등이 포함됩니다.
1. 다중 열 그룹화
# 부서와 근무년수로 그룹화
result = df.groupby(['부서', '근무년수'])['급여'].mean()
print(result)
# 리스트 형태로 여러 열 지정
columns = ['부서', '근무년수']
result = df.groupby(columns)['급여'].sum()
Python
복사
2. 사용자 정의 함수 적용
# 사용자 정의 함수 생성
def salary_status(x):
if x > 5000:
return '높음'
else:
return '보통'
# apply 함수를 사용한 사용자 정의 함수 적용
result = df.groupby('부서')['급여'].apply(lambda x: x.mean())
result_custom = df.groupby('부서')['급여'].apply(salary_status)
Python
복사
3. transform() 활용
# 각 부서별 평균 급여를 원본 데이터프레임에 추가
df['부서_평균급여'] = df.groupby('부서')['급여'].transform('mean')
# 부서별 급여 순위 계산
df['부서내_급여순위'] = df.groupby('부서')['급여'].transform(lambda x: x.rank(ascending=False))
Python
복사
4. 복합 연산
# 여러 열에 대한 다양한 집계 함수 적용
result = df.groupby('부서').agg({
'급여': ['mean', 'min', 'max', 'count'],
'근무년수': ['sum', 'mean'],
}).round(2)
# 결과 열 이름 변경
result.columns = ['평균급여', '최소급여', '최대급여', '직원수', '총근무년수', '평균근무년수']
Python
복사
5. size() 함수 활용
groupby() 객체에서 size() 함수를 사용하면 각 그룹의 크기(행 수)를 쉽게 계산할 수 있습니다. count()와 달리 size()는 NA/null 값도 포함하여 계산합니다.
# 부서별 직원 수 계산
group_size = df.groupby('부서').size()
print(group_size)
# 부서와 근무년수별 직원 수 계산
group_size_multi = df.groupby(['부서', '근무년수']).size()
print(group_size_multi)
# size()를 데이터프레임으로 변환
group_size_df = df.groupby(['부서', '근무년수']).size().reset_index(name='직원수')
Python
복사