[Pandas] agg / aggregate
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| a | b | |
|---|---|---|
| mean | 3.0 | 30.0 |
| std | 1.58 | 15.81 |
| min | 1 | 10 |
| max | 5 | 50 |
컬럼별 다른 함수
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| city | avg_sal | max_sal | avg_age |
|---|---|---|---|
| Busan | 4250 | 4500 | 35.0 |
| Seoul | 4000 | 5000 | 30.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 | 가…
💬 댓글