Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Pandas DataFrame을 일 단위(날짜 간격)로 그룹화하는 방법

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'(월) 등으로 바꿔 활용해 보세요.