Pandas 그룹화 및 집계

PandasBeginner
지금 연습하기

소개

데이터 그룹화 및 집계는 데이터 분석의 기본 작업입니다. 특정 기준에 따라 대규모 데이터셋을 더 작은 그룹으로 분할하고 각 그룹에 대한 요약 통계를 계산할 수 있습니다. 이 과정은 패턴을 발견하고, 세그먼트를 비교하고, 원시 데이터에서 의미 있는 통찰력을 도출하는 데 필수적입니다.

Python 데이터 분석 라이브러리인 Pandas 에서 이 "분할 - 적용 - 결합 (split-apply-combine)" 전략은 주로 강력한 groupby() 메서드를 통해 처리됩니다. 이 실습에서는 groupby()를 사용하여 그룹화 및 집계를 수행하는 방법을 배우게 됩니다. 단일 열로 데이터를 그룹화하고, 집계 함수를 적용하고, 여러 함수를 한 번에 사용하고, 여러 열로 그룹화하고, 마지막으로 출력을 표준 DataFrame 으로 형식화하는 것부터 시작할 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 91%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

groupby 를 사용하여 단일 열로 그룹화

이 단계에서는 DataFrame 을 그룹으로 분할하는 groupby() 메서드의 기본 사용법을 배우게 됩니다. groupby() 메서드 자체는 아무것도 계산하지 않지만 DataFrameGroupBy 객체를 반환합니다. 이 객체는 각 그룹에 계산을 적용하는 데 필요한 모든 정보를 보유합니다.

먼저 샘플 DataFrame 을 Category 열을 기준으로 그룹화합니다. 이렇게 하면 'Electronics', 'Clothing', 'Books'에 대한 별도의 그룹이 생성됩니다.

왼쪽 편집기에서 main.py 파일을 엽니다. DataFrame 을 생성하는 초기 코드는 이미 있습니다. 다음 코드를 main.py 파일 끝에 추가합니다.

## 'Category' 열을 기준으로 그룹화
grouped_by_category = df.groupby('Category')

## 결과는 DataFrameGroupBy 객체입니다.
print("Grouped object type:")
print(type(grouped_by_category))

## 내용을 보려면 그룹을 반복할 수 있습니다.
print("\nIterating over groups to see their content:")
for name, group in grouped_by_category:
    print(f"\nGroup: {name}")
    print(group)

이제 터미널에서 스크립트를 실행하여 출력을 확인합니다.

python3 main.py

원본 DataFrame, 이어서 groupby 객체의 유형, 그리고 각 그룹의 내용이 표시됩니다. 이는 DataFrame 이 'Category' 열의 고유 값을 기준으로 성공적으로 분할되었음을 보여줍니다.

Original DataFrame:
      Category Region  Sales  Units
0  Electronics  North   1200     10
1     Clothing  South    800     25
2  Electronics  North   1500      8
3        Books   West    300     15
4     Clothing   East    900     20
5        Books   West    450     18

==============================

Type of the grouped object:
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

Iterating over groups to see their content:

Group: Books
  Category Region  Sales  Units
3    Books   West    300     15
5    Books   West    450     18

Group: Clothing
   Category Region  Sales  Units
1  Clothing  South    800     25
4  Clothing   East    900     20

Group: Electronics
      Category Region  Sales  Units
0  Electronics  North   1200     10
2  Electronics  North   1500      8

그룹에 sum 집계 적용

이 단계에서는 생성한 그룹에 집계 함수를 적용하는 방법을 배우게 됩니다. 데이터를 그룹화한 후 가장 일반적인 다음 단계는 각 그룹에 대해 sum(), mean(), count(), max()와 같은 계산을 수행하는 것입니다.

각 제품 카테고리별 총 판매량을 계산해 보겠습니다. 이를 위해 먼저 Category로 그룹화한 다음 Sales 열을 선택하여 sum() 함수를 적용합니다.

이전 단계의 for 루프를 제거하여 출력을 깔끔하게 유지할 수 있습니다. 다음 코드를 main.py 파일 끝에 추가합니다.

## 'Category'로 그룹화하고 각 그룹의 'Sales' 합계 계산
category_sales_sum = df.groupby('Category')['Sales'].sum()

print("Total sales per category:")
print(category_sales_sum)

파일을 저장하고 다시 실행합니다.

python3 main.py

출력에는 이제 인덱스가 카테고리 이름이고 값이 해당 카테고리의 총 판매량인 Pandas Series 가 표시됩니다.

... (previous output) ...

Total sales per category:
Category
Books           750
Clothing       1700
Electronics    2700
Name: Sales, dtype: int64

이것은 데이터를 요약하는 강력하고 간결한 방법입니다. 동일한 논리를 다른 숫자 열에 적용하거나 mean()과 같은 다른 집계 함수를 사용하여 평균을 찾을 수 있습니다.

agg 로 여러 함수 집계

이 단계에서는 agg() 메서드를 사용하여 그룹에 여러 집계 함수를 동시에 적용하는 방법을 배우게 됩니다. 이는 총 판매량과 평균 판매량과 같이 여러 요약 통계를 한 번에 계산하려는 경우 매우 유용합니다.

agg() 메서드에는 집계 함수의 이름인 문자열 목록을 전달할 수 있습니다. 각 Category에 대한 Salessummean을 모두 계산해 보겠습니다.

다음 코드를 main.py 파일 끝에 추가합니다.

## 'Category'로 그룹화하고 'Sales'에 여러 집계 적용
category_agg = df.groupby('Category')['Sales'].agg(['sum', 'mean'])

print("\nSum and mean of sales per category:")
print(category_agg)

파일을 저장하고 실행합니다.

python3 main.py

이제 출력은 DataFrame 입니다. 인덱스는 여전히 Category이지만 열은 계층적이며 Sales 데이터에 대한 summean을 모두 표시합니다.

... (previous output) ...

Sum and mean of sales per category:
              sum    mean
Category
Books         750   375.0
Clothing     1700   850.0
Electronics  2700  1350.0

agg() 메서드는 그룹화된 데이터에 대한 포괄적인 요약을 생성하는 유연한 방법을 제공합니다.

여러 열로 그룹화

이 단계에서는 DataFrame 을 여러 열로 그룹화하는 방법을 배우게 됩니다. 이는 더 세분화된 그룹을 생성하고 다른 카테고리 간의 상호 작용을 분석하는 데 유용합니다. 이를 위해 groupby() 메서드에 열 이름 목록을 전달하기만 하면 됩니다.

RegionCategory의 각 조합에 대한 총 판매량을 찾아보겠습니다. 이를 통해 다양한 제품 카테고리의 판매량이 지역별로 어떻게 분포되는지 알 수 있습니다.

다음 코드를 main.py 파일 끝에 추가합니다.

## 여러 열로 그룹화: 'Region' 및 'Category'
multi_group_sum = df.groupby(['Region', 'Category'])['Sales'].sum()

print("\nTotal sales per Region and Category:")
print(multi_group_sum)

파일을 저장하고 스크립트를 실행합니다.

python3 main.py

출력에는 행에 MultiIndex가 있으며, 첫 번째 수준은 Region이고 두 번째 수준은 Category입니다. 이는 판매에 대한 자세한 분석을 제공합니다.

... (previous output) ...

Total sales per Region and Category:
Region  Category
East    Clothing        900
North   Electronics    2700
South   Clothing        800
West    Books           750
Name: Sales, dtype: int64

보시다시피 여러 열로 그룹화하면 데이터셋에 대한 더 깊고 계층적인 분석이 가능합니다.

그룹화된 DataFrame 에서 인덱스 재설정

이 단계에서는 그룹화된 출력을 일반 DataFrame 으로 다시 변환하는 방법을 배우게 됩니다. 여기서 그룹화 키는 인덱스가 아닌 열이 됩니다. 기본적으로 groupby()는 그룹화 키를 결과 Series 또는 DataFrame 의 인덱스로 만듭니다. 때로는 추가 처리 또는 시각화를 위해 "평탄한" DataFrame 을 원할 수 있습니다.

이를 달성하는 가장 쉬운 방법은 groupby() 메서드 내에서 as_index=False 매개변수를 사용하는 것입니다.

2 단계의 단일 열 그룹화를 반복하되, 이번에는 Category를 일반 열로 유지하겠습니다.

다음 코드를 main.py 파일 끝에 추가합니다.

## 'Category'로 그룹화하고 집계하되 'Category'를 열로 유지
category_sales_flat = df.groupby('Category', as_index=False)['Sales'].sum()

print("\nGrouped data with 'Category' as a column:")
print(category_sales_flat)

파일을 저장하고 마지막으로 실행합니다.

python3 main.py

출력을 관찰합니다. Category가 인덱스가 되는 대신, 이제 새 DataFrame 의 첫 번째 열이 되었으며 DataFrame 은 표준 정수 인덱스 (0, 1, 2) 를 가집니다.

... (previous output) ...

Grouped data with 'Category' as a column:
      Category  Sales
0        Books    750
1     Clothing   1700
2  Electronics   2700

이 형식은 후속 데이터 조작 작업에 더 편리한 경우가 많습니다. 대안적인 방법은 그룹화된 결과에 .reset_index()를 호출하는 것으로, 이는 동일한 결과를 얻습니다.

요약

Pandas 그룹화 및 집계에 대한 이 실습을 완료하신 것을 축하드립니다! Pandas 라이브러리의 가장 강력하고 일반적으로 사용되는 데이터 분석 기능 중 하나를 배우셨습니다.

이 실습에서는 다음을 연습했습니다.

  • df.groupby('column_name')을 사용하여 DataFrame 을 그룹으로 분할합니다.
  • 그룹에 .sum()과 같은 단일 집계 함수를 적용합니다.
  • .agg() 메서드를 사용하여 여러 집계 함수를 한 번에 적용합니다.
  • df.groupby(['col1', 'col2'])를 사용하여 계층적 요약을 생성하기 위해 여러 열로 그룹화합니다.
  • as_index=False 매개변수를 사용하여 groupby 작업에서 평탄한 DataFrame 을 생성합니다.

이러한 기술을 숙달하는 것은 Python 및 Pandas 를 사용한 데이터 조작 및 분석에 능숙해지기 위한 중요한 단계입니다.