Skip to content

[설명] Python, Pandas, PySpark에서 데이터프레임을 그룹화하는 방법

데이터 그룹화는 데이터 분석의 필수적인 부분으로, 집계 계산이나 복잡한 변환을 적용하는 데 사용됩니다. Python의 pandas groupby 함수는 이러한 작업을 효율적으로 수행할 수 있는 강력하고 다재다능한 도구입니다. 뛰어난 기능성을 바탕으로, 특정 조건에 따라 그룹화된 데이터를 조작하는 프로세스를 간소화하여 데이터 분석 작업을 훨씬 더 원할하게 만들어 줍니다.

pandas groupby 함수는 최적화된 구현을 통해 대용량 데이터프레임 처리에 특히 강력합니다. pandas DataFrame groupby를 활용하면 단일 또는 여러 열을 기준으로 그룹화할 수 있으며, 여러 집계 함수를 적용하고, 필터링 및 정렬된 그룹화된 데이터와 같은 고급 작업도 수행할 수 있습니다. 이 가이드는 pandas groupby 함수의 능력을 해체하여 통찰력, 모범 사례 및 실제 예제를 제공하는 것을 목표로 합니다.

Python Pandas Dataframe에서 No code로 데이터 시각화를 빠르게 만들고 싶으세요?

PyGWalker는 Visualization을 통한 Exploratory Data Analysis에 사용되는 Python 라이브러리입니다. PyGWalker (opens in a new tab)를 사용하면 pandas 데이터프레임(그리고 polars 데이터프레임)을 Tableau 스타일의 UI로 시각적 탐색을 위한 도구로 변환하여 Jupyter Notebook 데이터 분석 및 데이터 시각화 워크플로우를 간소화할 수 있습니다.

PyGWalker를 사용한 데이터 시각화 (opens in a new tab)

Pandas GroupBy의 이해

간단히 말해, pandas groupby 작업은 특정 기준에 따라 데이터를 그룹으로 나누고, 각 그룹에 함수를 적용한 다음 결과를 결합하는 것입니다. 이 프로세스는 "분할-적용-결합(split-apply-combine)" 전략이라고도 알려져 있으며, 이 용어는 pandas 라이브러리 자체에서 만들어진 것입니다.

Pandas의 groupby 함수는 SQL의 GROUP BY 구문과 유사한 개념을 활용하여 데이터 분석을 위해 SQL에서 Python으로 전환하는 데 용이합니다.

다음은 pandas dataframe groupby를 사용하는 기본 예시입니다:

import pandas as pd
 
## 샘플 데이터프레임 생성
data = {
    'Name': ['John', 'Anna', 'John', 'Anna', 'John', 'Anna'],
    'Subject': ['Maths', 'Maths', 'Physics', 'Physics', 'Chemistry', 'Chemistry'],
    'Score': [85, 90, 78, 88, 92, 95]
}
 
df = pd.DataFrame(data)
 
## groupby 적용
grouped = df.groupby('Name')
for name, group in grouped:
    print("\n", name)
    print(group)

여러 열로 그룹화하기

단일 열을 기준으로 그룹화하는 것 외에도, pandas groupby는 여러 열로 그룹화하는 기능도 지원합니다. 여러 속성을 기준으로 데이터를 범주화하려는 경우 특히 유용합니다. 이전 예제를 확장하여 pandas groupby multiple columns 작업을 수행해 보겠습니다:

## 여러 열로 groupby 적용
grouped_multiple = df.groupby(['Name', 'Subject'])
for (name, subject), group in grouped_multiple:
    print("\n", name, subject)
    print(group)

보시다시피, pandas dataframe groupby는 먼저 'Name'으로 데이터를 그룹화하고, 그런 다음 'Name' 그룹 내에서 'Subject'로 그룹화했습니다. 이러한 종류의 그룹화를 통해 복잡한 데이터 분석 작업이 가능해집니다.

Pandas GroupBy와 함께 사용하는 집계 함수

pandas groupby의 주요 장점 중 하나는 그룹화된 데이터에 집계 함수를 적용할 수 있다는 점입니다. 일반적인 집계 함수로는 sum, mean, count, maxmin이 있습니다. pandas groupbysum을 사용한 예시를 살펴보겠습니다:

## groupby와 sum 사용 예시
grouped_sum = df.groupby('Name')['Score'].sum()
print(grouped_sum)
 
 

이 예시에서는 각 학생의 점수를 합산하고 있습니다. groupby 바로 뒤에 열 인덱서(['Score'])를 사용한 것을 주목해 주세요. 이는 sum 함수를 숫자 데이터에만 적용할 수 있기 때문입니다. 따라서 sum 함수를 적용하기 위해 'Score' 열을 선택해야 합니다.

Pandas GroupBy로 데이터 정렬하기

그룹화 작업을 수행한 후에 데이터를 정렬하는 것은 흔한 작업입니다. 예를 들어, 그룹을 집계 값에 따라 정렬하고 싶을 수 있습니다. groupby sort values in pandas를 사용하는 방법은 다음과 같습니다:

## groupby 이후 데이터 정렬
grouped_sorted = df.groupby('Name')['Score'].sum().sort_values(ascending=False)
print(grouped_sorted)

이 예시에서는 먼저 'Name'으로 데이터프레임을 그룹화하고, 각 그룹의 'Score'를 합산한 다음, 'Score' 합계에 따라 그룹을 내림차순으로 정렬합니다.

GroupBy Apply로 사용자 정의 집계 함수 적용하기

pandas groupby는 사용자 정의 집계를 apply 함수를 사용하여 적용할 수 있는 기능도 제공합니다. 내장된 집계 함수가 부족한 경우에 유용합니다. 예를 들어, 각 학생별로 점수의 범위(최댓값 - 최솟값)를 계산하려는 경우 groupby apply in pandas를 다음과 같이 사용할 수 있습니다:

## groupby apply로 사용자 정의 집계 적용
grouped_apply = df.groupby('Name')['Score'].apply(lambda x: x.max() - x.min())
print(grouped_apply)

이 예에서는 각 그룹에 대해 람다 함수를 사용하여 'Score'의 범위를 계산하고, 이 함수를 apply를 사용하여 각 그룹에 적용합니다.

Pandas의 GroupBy와 Pivot의 차이점

pandas groupby와 피봇 테이블은 모두 데이터 요약에 강력한 도구입니다. 그러나 그들은 서로 다른 목적과 다른 문맥에서 사용됩니다. 예를 들어, 데이터를 요약하기 위해서는 pandas groupby를 사용하고, 데이터를 재구성하기 위해서는 피봇 테이블을 사용합니다.

pandas groupby 작업에서는 그룹화할 하나 이상의 열을 지정하고, 각 그룹에 적용할 집계 함수를 지정합니다. 반면 피봇 테이블은 간단한 열별 데이터를 입력으로 사용하며, 항목을 다차원 분석을 제공하는 이차원 테이블로 그룹화합니다.

Pandas에서 비숫자 데이터를 GroupBy하기

Pandas에서 비숫자 데이터를 groupby 할 수 있습니다. sum, mean과 같은 집계 함수는 비숫자 데이터에 적용할 수 없지만, 비숫자 데이터에 대해서도 수행할 수 있는 많은 다른 작업이 있습니다. 예를 들어, 각 범주의 발생 횟수를 세거나, 비숫자 열의 데이터 유형에 따라 의미 있는 함수를 적용할 수 있습니다.

## 비숫자 데이터를 그룹화하고 개수 세기
grouped_count = df.groupby('Name')['Subject'].count()
print(grouped_count)

이 예제에서는 'Name'으로 그룹화하고 'Subject'를 개수로 세는 작업을 수행합니다.

PySpark에서 GroupBy 기능

groupby 개념은 PySpark와 같은 대용량 데이터 프레임워크에도 적용됩니다. 구문은 약간 다르지만, 아이디어는 동일하게 데이터를 그룹으로 나누고 각 그룹에 어떤 함수를 적용하는 것입니다.

## PySpark에서 GroupBy
from pyspark.sql import SparkSession
 
spark = SparkSession.builder.getOrCreate()
 
## PySpark DataFrame에 데이터 로드
df_pyspark = spark.createDataFrame(df)
 
## PySpark에서 GroupBy
df_pyspark.groupby('Name').agg({'Score': 'sum'}).show()

PySpark에서 그룹화 후에는 agg 함수를 사용하여 각 그룹에 집계 함수를 적용해야 합니다. 위의 예시에서는 'Name'으로 그룹화하고 각 그룹의 'Score'를 합산하고 있습니다.

Python을 사용한 데이터 분석의 영역을 더 깊이 파고들면, pandas dataframe groupby가 신뢰할 수 있는 동반자가 될 것입니다. 그 유연성과 강력한 기능을 통해, 이전에 프로그래밍 또는 통계학 배경이 있는 사람들만 사용할 수 있었던 다양한 방식으로 데이터를 처리하고 탐색할 수 있습니다. 그러므로 다양한 기능을 실험해보면서 데이터가 가치 있는 통찰력을 제공하는 것을 지켜봐 주세요!

자주 묻는 질문

  1. groupby와 피벗 테이블의 차이점은 무엇인가요?

Pandas의 groupby는 카테고리에 따라 데이터를 요약하는 데 사용되는 반면, 피봇 테이블은 데이터를 이차원 테이블로 재구성하는 데 사용됩니다.

  1. Pandas에서 비숫자 데이터를 groupby할 수 있나요?

네, Pandas에서 비숫자 데이터를 groupby할 수 있습니다. sum 또는 mean과 같은 집계 함수는 비숫자 데이터에 적용할 수 없지만, 각 범주의 발생 횟수를 세는 작업 등은 수행할 수 있습니다.

  1. PySpark에서 groupby를 어떻게 사용하나요?

PySpark에서도 groupby 개념이 적용됩니다. 그룹화된 데이터에 대해 어떤 함수를 적용하는 것은 Pandas와 동일합니다.