Python/Pandas

[Pandas] 그룹화 및 집계함수

죵욜이 2024. 12. 16. 03:58

GroupBy (그룹화)

  • 기준 열을 바탕으로 데이터를 그룹화
  •  groupby() 
import pandas as pd

# 예시 데이터프레임
df = pd.DataFrame({
    'A': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'B': [10, 20, 30, 40, 50, 60],
    'C': [5, 10, 15, 20, 25, 30]
})

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

# 그룹화된 객체 출력
print(grouped)
# 출력
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f7c4a56baf0>
  •  groupby()  는 그룹화된 객체를 반환하며, 그룹별 연산을 하려면 추가적인 집계 함수가 필요함

그룹화 후 집계 (Aggregation)

  • 그룹화 후 집계함수를 사용해 각 그룹에 대해 연산을 수행한다
  • 집계함수
    • sum() - 합계
    • mean() - 평균
    • count() - 개수
    • max() - 최대
    • min() - 최소
# 그룹별 합계 계산
grouped_sum = grouped.sum()
print(grouped_sum)
# 출력
    B   C
A        
X   90  45
Y   120  60

여러 집계 함수 적용 (agg)

  •  agg() 
  • 그룹별로 여러개의 집계 함수를 동시에 적용 가능
  • 다양한 통계량을 한번에 계산
# 여러 집계 함수 적용
grouped_agg = grouped.agg({
    'B': ['sum', 'mean'],  # 'B' 열에 대해 합계와 평균 계산
    'C': ['max', 'min']    # 'C' 열에 대해 최댓값과 최솟값 계산
})

print(grouped_agg)
# 출력
       B           C     
     sum  mean max min
A                      
X     90  30.0  25  5
Y    120  40.0  30 10
  • 각 그룹별로 'B' 열의 합계와 평균을, 'C' 열의 최댓값과 최솟값을 계산

조건을 적용한 그룹화

  •  .filter() 
  • 커스텀해서 조건을 걸어줄 수 있음
# 'B' 열의 평균이 40 이상인 그룹만 필터링
filtered_group = grouped.filter(lambda x: x['B'].mean() >= 40)
print(filtered_group)
# 출력
   A   B   C
3  Y  40  20
5  Y  60  30

 

  • 'A' 열을 기준으로 그룹화 한 후, 각 그룹의 'B' 열 평균이 40 이상인 그룹만 추출

 transform()  을 사용한 변환

  • 그룹화된 데이터를 각 그룹 내에서 변환할 때 사용
  • 데이터를 그룹별로 변환하지만, 원본 데이터의 크기를 유지
# 'B' 열에 대해 그룹별 평균을 계산하고, 이를 각 원본 값에 적용
df['B_mean'] = grouped['B'].transform('mean')
print(df)
   A   B   C  B_mean
0  X  10   5    30.0
1  Y  20  10    40.0
2  X  30  15    30.0
3  Y  40  20    40.0
4  X  50  25    30.0
5  Y  60  30    40.0
  • 각 그룹의 'B' 열 평균을 계산하고, 이를 각 행에 변환하여 추가한 결과

 apply()  를 사용한 그룹별 함수 적용

  • 그룹에 대해 사용자가 정의한 함수를 적용
  • 더 복잡한 계산이나 변환이 필요할 때 유용
# 그룹별로 'B' 값의 합과 평균을 계산하는 사용자 정의 함수 적용
grouped_apply = grouped.apply(lambda x: pd.Series({'B_sum': x['B'].sum(), 'B_mean': x['B'].mean()}))
print(grouped_apply)
# 출력
      B_sum  B_mean
A                    
X       90    30.0
Y      120    40.0