Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python – Group By และ Sum คอลัมน์ตามเดือน (Monthly Sum) ใน Pandas

ภาพรวม

จัดกลุ่มข้อมูลตามเดือน (monthly frequency) จากคอลัมน์ datetime แล้วคำนวณ sum ของคอลัมน์ตัวเลข ใช้ pd.Grouper

ตัวอย่างโค้ด


import pandas as pd

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)

# Group by month using Grouper
monthly_sum = dataFrame.groupby(pd.Grouper(key='Date_of_Purchase', freq='M')).sum()

print("\nGroup Dataframe by month...\n", monthly_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 month...
               Reg_Price
Date_of_Purchase
2021-01-31        4250.0
2021-02-28           NaN
2021-03-31        1700.0
2021-04-30           NaN
2021-05-31        1350.0
2021-06-30        3000.0
2021-07-31        1400.0

คำอธิบาย

  • freq='M' = Month End (สิ้นเดือน)
  • freq='MS' = Month Start (ต้นเดือน)
  • เดือนที่ไม่มีข้อมูล (Feb, Apr) จะได้ NaN
  • คอลัมน์ non-numeric (Car) ถูกลบออกอัตโนมัติใน .sum()

วิธีอื่น: resample (ต้อง set index ก่อน)


df = dataFrame.set_index('Date_of_Purchase')
monthly = df.resample('M')['Reg_Price'].sum()

จัดการ NaN


monthly_sum.fillna(0)           # แทน NaN ด้วย 0
monthly_sum.dropna()            # ลบแถว NaN
monthly_sum.asfreq('M', fill_value=0) # กำหนด frequency และ fill