Pandas에서는 groupby() 함수를 사용해 DataFrame을 손쉽게 그룹화할 수 있습니다. 이때 pd.Grouper를 함께 사용하면 날짜 열을 기준으로 원하는 주기별로 데이터를 묶을 수 있습니다. 이 글에서는 차량 판매 기록 예제를 통해 날짜를 일 간격으로 그룹화하고, 구간별 등록 가격(Reg_Price)의 합계를 계산하는 방법을 살펴보겠습니다.
groupby()와 Grouper로 날짜 기준 그룹화하기
groupby() 메서드 안에서 pd.Grouper를 사용하면 그룹화 기준이 될 날짜 열을 선택할 수 있습니다. freq 매개변수에 일 단위 간격을 지정하는데, 예를 들어 '7D'로 설정하면 날짜 열에 있는 첫 번째 날짜부터 마지막 날짜까지 7일 간격으로 데이터가 묶입니다.
예제 DataFrame 생성
먼저 Car(차종), Date_of_Purchase(구매 날짜), Reg_Price(등록 가격) 세 개의 열을 가진 DataFrame을 만들어 보겠습니다.
import pandas as pd
# Date_of_Purchase 열을 포함한 DataFrame 생성
dataFrame = pd.DataFrame(
{
"Car": ["Audi", "Lexus", "Tesla", "Mercedes", "BMW", "Toyota", "Nissan", "Bentley", "Mustang"],
"Date_of_Purchase": [
pd.Timestamp("2021-06-10"),
pd.Timestamp("2021-07-11"),
pd.Timestamp("2021-06-25"),
pd.Timestamp("2021-06-29"),
pd.Timestamp("2021-03-20"),
pd.Timestamp("2021-01-22"),
pd.Timestamp("2021-01-06"),
pd.Timestamp("2021-01-04"),
pd.Timestamp("2021-05-09")
],
"Reg_Price": [1000, 1400, 1100, 900, 1700, 1800, 1300, 1150, 1350]
}
)
7일 간격으로 그룹화 수행
이제 groupby() 함수 내에서 Grouper를 사용해 Date_of_Purchase 열을 기준으로 그룹화합니다. 빈도(freq)는 '7D', 즉 7일 간격으로 설정했으며, 열에 기록된 마지막 날짜까지 해당 간격으로 데이터가 묶입니다.
print("\nGroup Dataframe by 7 days...\n",
dataFrame.groupby(pd.Grouper(key='Date_of_Purchase', axis=0, freq='7D')).sum())
전체 예제 코드
지금까지의 내용을 하나로 정리한 전체 코드는 다음과 같습니다.
import pandas as pd
# Date_of_Purchase 열을 포함한 DataFrame 생성
dataFrame = pd.DataFrame(
{
"Car": ["Audi", "Lexus", "Tesla", "Mercedes", "BMW", "Toyota", "Nissan", "Bentley", "Mustang"],
"Date_of_Purchase": [
pd.Timestamp("2021-06-10"),
pd.Timestamp("2021-07-11"),
pd.Timestamp("2021-06-25"),
pd.Timestamp("2021-06-29"),
pd.Timestamp("2021-03-20"),
pd.Timestamp("2021-01-22"),
pd.Timestamp("2021-01-06"),
pd.Timestamp("2021-01-04"),
pd.Timestamp("2021-05-09")
],
"Reg_Price": [1000, 1400, 1100, 900, 1700, 1800, 1300, 1150, 1350]
}
)
print("DataFrame...\n", dataFrame)
# groupby 함수 내 Grouper로 Date_of_Purchase 열 선택
print("\nGroup Dataframe by 7 days...\n",
dataFrame.groupby(pd.Grouper(key='Date_of_Purchase', axis=0, freq='7D')).sum()
)
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
DataFrame...
Car Date_of_Purchase Reg_Price
0 Audi 2021-06-10 1000
1 Lexus 2021-07-11 1400
2 Tesla 2021-06-25 1100
3 Mercedes 2021-06-29 900
4 BMW 2021-03-20 1700
5 Toyota 2021-01-22 1800
6 Nissan 2021-01-06 1300
7 Bentley 2021-01-04 1150
8 Mustang 2021-05-09 1350
Group Dataframe by 7 days...
Reg_Price
Date_of_Purchase
2021-01-04 2450.0
2021-01-11 NaN
2021-01-18 1800.0
2021-01-25 NaN
2021-02-01 NaN
2021-02-08 NaN
2021-02-15 NaN
2021-02-22 NaN
2021-03-01 NaN
2021-03-08 NaN
2021-03-15 1700.0
2021-03-22 NaN
2021-03-29 NaN
2021-04-05 NaN
2021-04-12 NaN
2021-04-19 NaN
2021-04-26 NaN
2021-05-03 1350.0
2021-05-10 NaN
2021-05-17 NaN
2021-05-24 NaN
2021-05-31 NaN
2021-06-07 1000.0
2021-06-14 NaN
2021-06-21 1100.0
2021-06-28 900.0
2021-07-05 1400.0
결과 해석
출력 결과를 보면 날짜가 7일 간격 구간으로 나뉘어 각 구간의 Reg_Price 합계가 계산된 것을 확인할 수 있습니다. 예를 들어 2021-01-04 구간에는 1월 6일(1300)과 1월 4일(1150)의 구매 건이 포함되어 합계 2450이 됩니다. 반면 값이 NaN인 구간은 해당 7일 동안 구매 기록이 없었다는 의미입니다.
이처럼 groupby()와 pd.Grouper를 조합하면 복잡한 날짜 처리 없이도 일별, 주별, 월별 등 다양한 시간 단위의 집계를 간단하게 수행할 수 있습니다. 필요에 따라 freq 값을 '1D'(하루), 'M'(월) 등으로 바꿔 활용해 보세요.