이번 포스팅에서는 결과물의 차원에 초점을 두고 DataFrame의 집계 method에 대해서 알아보도록 하겠습니다. 매서드들의 결과물은 당연하게도 어떤 함수냐에 따라 다양한 shape으로 나올 수 있습니다. “결과물의 차원(Shape)” 관점에서 메서드들을 나눠 보면 크게 세 가지로 분류할 수 있습니다:
결과가 그룹 수 혹은 컬럼 수만큼의 차원을 가지며, 원본보다 작아집니다. 예) agg() / aggregate(), mean(), sum() 등
# 그룹별 총합(scalar 반환 → 축소)
result = df.groupby('A').agg('sum')
print(result)
print(result.shape) # (3, 2) → 그룹 3개, 컬럼 2개
2. 변환(Transformation)
각 그룹 혹은 컬럼에 함수를 적용하되, 원본과 같은 차원을 유지합니다. 예) 대표 메서드: transform()
# 그룹별 평균으로 원본 크기 유지 → 5행 2컬럼
trans = df.groupby('A')[['v1','v2']].transform('mean')
print(trans)
print(trans.shape) # (5, 2)
3. 확장(Expansion) / 사용자 정의 적용
사용자가 반환하는 형태에 따라 결과 차원이 자유롭게 달라집니다. 예) apply()
# 예: 각 그룹별로 (max - min) 차이를 계산해 Series 반환
def range_diff(subdf):
return pd.Series({
'v1_range': subdf['v1'].max() - subdf['v1'].min(),
'v2_range': subdf['v2'].max() - subdf['v2'].min()
})
applied = df.groupby('A').apply(range_diff)
Comment1) groupby 후에도 이런 dataframe의 집계 매서드들을 유사하게 사용할 수 있습니다. 대신 '그룹 별'로 이 계산을 하는 것일 뿐 기능적으로는 비슷하게 작동한다는 것이죠. (차원도 기본적으로 데이터프레임 매서드의 output 꼴을 따라가되, '그룹 별'로 나오겠죠)
Comment2) 집계매서드 들 중에서 일부는 DataFrame형태가 아닌 Series 형태에서만 적용가능한 것들도 있습니다(예: unique, value_counts, nlargest, nsmallest)