[설명] Python, Pandas, PySpark에서 데이터프레임을 그룹화하는 방법
Published on
데이터 그룹화는 데이터 분석의 필수적인 부분으로, 집계 계산이나 복잡한 변환을 적용하는 데 사용됩니다. 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 데이터 분석 및 데이터 시각화 워크플로우를 간소화할 수 있습니다.
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
, max
및 min
이 있습니다. pandas groupby
와 sum
을 사용한 예시를 살펴보겠습니다:
## 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
가 신뢰할 수 있는 동반자가 될 것입니다. 그 유연성과 강력한 기능을 통해, 이전에 프로그래밍 또는 통계학 배경이 있는 사람들만 사용할 수 있었던 다양한 방식으로 데이터를 처리하고 탐색할 수 있습니다. 그러므로 다양한 기능을 실험해보면서 데이터가 가치 있는 통찰력을 제공하는 것을 지켜봐 주세요!
자주 묻는 질문
groupby
와 피벗 테이블의 차이점은 무엇인가요?
Pandas의 groupby
는 카테고리에 따라 데이터를 요약하는 데 사용되는 반면, 피봇 테이블은 데이터를 이차원 테이블로 재구성하는 데 사용됩니다.
- Pandas에서 비숫자 데이터를
groupby
할 수 있나요?
네, Pandas에서 비숫자 데이터를 groupby
할 수 있습니다. sum
또는 mean
과 같은 집계 함수는 비숫자 데이터에 적용할 수 없지만, 각 범주의 발생 횟수를 세는 작업 등은 수행할 수 있습니다.
- PySpark에서
groupby
를 어떻게 사용하나요?
PySpark에서도 groupby
개념이 적용됩니다. 그룹화된 데이터에 대해 어떤 함수를 적용하는 것은 Pandas와 동일합니다.