본문으로 건너뛰기
김신건의 로그

[Pandas] agg / aggregate

· 수정 · 📖 약 1분 · 269자/단어 #python #pandas #aggregation #groupby
Pandas agg, Pandas aggregate, named aggregation

정의

agg(func)여러 집계 함수를 한 번에 적용 한다. GroupBy, DataFrame, Series 모두에서 사용 가능. aggregate 는 같은 함수의 별칭.

다양한 형태

단일 함수

df.agg('mean')                 # 모든 컬럼에 mean
df['col'].agg('sum')

함수 리스트

df.agg(['mean', 'sum', 'std'])  # 각 컬럼에 여러 함수
python
import pandas as pd
df = pd.DataFrame({'a': [1,2,3,4,5], 'b': [10,20,30,40,50]})
print(df.agg(['mean', 'std', 'min', 'max']))
결과
        a          b
mean  3.000000  30.000000
std   1.581139  15.811388
min   1.000000  10.000000
max   5.000000  50.000000
ab
mean3.030.0
std1.5815.81
min110
max550

컬럼별 다른 함수

df.agg({
    'salary': ['mean', 'sum'],
    'age': ['min', 'max'],
})

groupby + agg

df.groupby('city').agg({
    'salary': ['mean', 'max'],
    'age': 'mean',
})

결과는 MultiIndex 컬럼.

named aggregation (이름 있는 집계)

df.groupby('city').agg(
    avg_salary=('salary', 'mean'),
    max_salary=('salary', 'max'),
    avg_age=('age', 'mean'),
)
python
import pandas as pd
df = pd.DataFrame({
  'city': ['Seoul', 'Busan', 'Seoul', 'Busan'],
  'salary': [3000, 4000, 5000, 4500],
  'age': [25, 30, 35, 40],
})
result = df.groupby('city').agg(
  avg_sal=('salary', 'mean'),
  max_sal=('salary', 'max'),
  avg_age=('age', 'mean'),
)
print(result)
결과
       avg_sal  max_sal  avg_age
city
Busan   4250.0     4500     35.0
Seoul   4000.0     5000     30.0
cityavg_salmax_salavg_age
Busan4250450035.0
Seoul4000500030.0

가장 깔끔한 권장 패턴, 컬럼 이름이 명확.

람다 / 사용자 함수

df.groupby('city').agg(
    median_sal=('salary', lambda s: s.median()),
    range_sal=('salary', lambda s: s.max() - s.min()),
)

람다의 단점: 함수명이 <lambda> 로 표시. named aggregation 으로 보완.

자주 쓰는 집계 함수 모음

함수의미
'mean', 'sum', 'std', 'var'기본 통계
'min', 'max', 'median'분포
'count'non-null 개수
'size'전체 개수 (NaN 포함)
'first', 'last'그룹 내 위치
'nunique'고유값 개수
'quantile'분위수 (default 0.5 = median)
'idxmin', 'idxmax'최소/최대 위치
'mode'최빈값 (Series of mode)

함정

1. MultiIndex 컬럼

df.groupby('city').agg({'salary': ['mean', 'max']})
# 컬럼이 ('salary', 'mean'), ('salary', 'max') MultiIndex
# 평탄화: df.columns = ['_'.join(c) for c in df.columns]

named aggregation 이 이를 자연스럽게 회피.

2. 함수 이름의 충돌

df.agg(['mean', 'sum', np.mean])    # mean 이 두 번 → 컬럼 충돌

3. groupby + agg 의 dropna

df.groupby('city', dropna=False).agg(...)
# city 가 NaN 인 그룹도 포함

참고

이 글의 용어 (3개)
[Pandas] groupbypandas
정의 는 데이터를 그룹으로 나누고 (split), 각 그룹에 함수를 적용 (apply), 결과를 합쳐 (combine) 새 DataFrame 으로 만드는 split-apply-c…
[Pandas] pivot_tablepandas
정의 는 의 확장. 집계 함수를 동반 해 중복 (index, columns) 도 처리. Excel 의 피벗 테이블과 가장 가까운 기능. 기본 <CodeWithOutput lang…
[Pandas] transform / applypandas
정의 | 메서드 | 입력 | 출력 | 용도 | |:---|:---|:---|:---| | | 그룹 | 같은 shape | 정규화, 보충 | | | 그룹 | 임의 shape | 가…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기