Pandas의 GroupBy 기능을 활용하면 데이터를 특정 열 기준으로 묶은 뒤, 음수 값과 양수 값을 각각 따로 합산할 수 있습니다. 이 글에서는 도시별 온도 데이터를 예로 들어, 음수 온도의 합계와 양수 온도의 합계를 동시에 구하는 방법을 단계별로 살펴보겠습니다.
1단계: 양수·음수 값이 포함된 DataFrame 생성
먼저 도시 이름(Place)과 섭씨 온도(Temperature)를 담은 데이터프레임을 생성합니다. 온도 값에는 양수와 음수가 함께 들어 있습니다.
dataFrame = pd.DataFrame({'Place': ['Chicago', 'Denver', 'Atlanta', 'Chicago', 'Dallas', 'Denver','Dallas', 'Atlanta'], 'Temperature': [-2, 30, -5, 10, 30, -5, 20, -10]})2단계: Place 열 기준으로 그룹화
다음으로 groupby() 메서드를 사용해 'Place' 열을 기준으로 데이터를 그룹화합니다. 이렇게 하면 같은 도시의 온도 데이터들이 하나의 그룹으로 묶입니다.
groupRes = dataFrame.groupby(dataFrame['Place'])
3단계: 조건부 합계 함수 정의
양수 값만 골라 더하는 함수와 음수 값만 골라 더하는 함수를 각각 정의합니다. 불리언 마스킹(val > 0, val < 0)을 활용해 원하는 부호의 값만 필터링한 후 합계를 구합니다.
# 조건부 합계 함수 def plus(val): return val[val > 0].sum() def minus(val): return val[val < 0].sum()
전체 예제 코드
지금까지의 과정을 모두 포함한 전체 코드는 다음과 같습니다. agg() 메서드에 함수를 튜플 형태로 전달하면, 하나의 그룹 연산으로 두 개의 집계 결과(음수 합계, 양수 합계)를 동시에 얻을 수 있습니다.
import pandas as pd
# 섭씨 온도가 담긴 DataFrame 생성
dataFrame = pd.DataFrame({'Place': ['Chicago', 'Denver', 'Atlanta', 'Chicago', 'Dallas', 'Denver','Dallas', 'Atlanta'], 'Temperature': [-2, 30, -5, 10, 30, -5, 20, -10]})
print(dataFrame)
# Place 열을 기준으로 그룹화
groupRes = dataFrame.groupby(dataFrame['Place'])
# 조건부 합계 함수
def plus(val):
return val[val > 0].sum()
def minus(val):
return val[val < 0].sum()
print(groupRes['Temperature'].agg([('negTemp', minus), ('posTemp', plus)]))실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
Place Temperature 0 Chicago -2 1 Denver 30 2 Atlanta -5 3 Chicago 10 4 Dallas 30 5 Denver -5 6 Dallas 20 7 Atlanta -10 negTemp posTemp Place Atlanta -15 0 Chicago -2 10 Dallas 0 50 Denver -5 30
결과 해석
출력 결과를 보면 각 도시별로 negTemp(음수 온도 합계)와 posTemp(양수 온도 합계)가 계산된 것을 확인할 수 있습니다. 예를 들어 Atlanta는 음수 온도(-5, -10)의 합인 -15가 기록되고 양수 온도가 없어 0이 됩니다. 반대로 Dallas는 음수 온도가 없어 0이며, 양수 온도(30, 20)의 합인 50이 기록됩니다. 이처럼 groupby()와 agg()를 조합하면 복잡한 조건부 집계도 간결한 코드로 처리할 수 있습니다.