在Pandas DataFrame中计算相邻周一之间的收入总和
问题描述
现有如下Pandas DataFrame,包含日期(Date)、当日收入(Revenue)、星期几(Weekday)三列:
import pandas as pd df = pd.DataFrame({ 'Date':['2015-01-08','2015-01-09','2015-01-10','2015-02-10','2015-08-09','2015-08-13','2015-11-09','2015-11-15'], 'Revenue':[15,4,15,13,16,20,12,9], 'Weekday':['Monday','Tuesday','Wednesday','Monday','Friday','Saturday','Monday','Sunday'] })
需求:计算相邻两个周一之间的所有收入总和(即上一个周一到下一个周一前一天的收入总和),结果用下一个周一的日期标识,示例结果如下:
2015-02-10 34 Monday 2015-11-09 49 Monday
解决方案
以下是精准匹配需求的实现步骤:
- 转换日期格式并排序:先把
Date列转为Pandas日期类型,确保数据按时间顺序排列
df['Date'] = pd.to_datetime(df['Date']) df = df.sort_values('Date').reset_index(drop=True)
- 提取所有周一的日期:筛选出DataFrame中所有周一的日期,用于后续划分区间
monday_dates = df[df['Weekday'] == 'Monday']['Date'].tolist()
- 为每行匹配对应的下一个周一:对每个日期,找到它之后的第一个周一,作为该日期收入所属的区间标识
df['next_monday'] = df['Date'].apply(lambda x: next((m for m in monday_dates if m > x), None))
- 按区间分组计算总和:以
next_monday为分组键,聚合计算每个区间的收入总和,最后整理成需求的格式
# 过滤掉没有下一个周一的行(即最后一个周一及之后的行) result = df.dropna(subset=['next_monday']).groupby('next_monday').agg( Total_Revenue=('Revenue', 'sum'), Weekday=('Weekday', lambda x: 'Monday') ).reset_index().rename(columns={'next_monday': 'Date'})
执行上述代码后,result的输出为:
Date Total_Revenue Weekday 0 2015-02-10 34 Monday 1 2015-11-09 49 Monday
完全匹配示例需求。
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

