Pandas DataFrame指定日期区间按多字段分组求和如何实现?
实现步骤
1. 统一日期格式
首先要把date列和起止日期变量都转为Pandas的datetime格式,避免字符串比较出现逻辑错误:
# 转换日期格式 df['date'] = pd.to_datetime(df['date']) startdate = pd.to_datetime(startdate) enddate = pd.to_datetime(enddate)
2. 两种实现方案
方案1:用transform直接生成新列(代码更简洁)
先把不在日期区间内的销售额临时置为0,再分组求和后赋值给对应组的所有行:
df['sum_sales'] = df.assign( temp_sales = lambda x: x['sales'].where((x['date'] >= startdate) & (x['date'] <= enddate), 0) ).groupby(['product', 'state'])['temp_sales'].transform('sum')
方案2:先计算分组和再合并(逻辑更清晰)
先筛选符合日期要求的行,分组求和后再合并回原数据集,无匹配的分组自动补0:
# 计算符合日期区间的分组销售额总和 group_sum = df[(df['date'] >= startdate) & (df['date'] <= enddate)]\ .groupby(['product', 'state'], as_index=False)['sales']\ .sum()\ .rename(columns={'sales': 'sum_sales'}) # 合并到原DataFrame df = df.merge(group_sum, on=['product', 'state'], how='left').fillna({'sum_sales': 0})
最终输出效果
运行后得到的df如下:
| date | product | state | sales | sum_sales |
|---|---|---|---|---|
| 2021-09-12 | item1 | IL | 5 | 5 |
| 2021-09-12 | item2 | CA | 7 | 15 |
| 2021-08-13 | item2 | CA | 8 | 15 |
| 2021-06-12 | item3 | NY | 10 | 0 |
| 2021-05-01 | item1 | IL | 11 | 5 |
内容的提问来源于stack exchange,提问作者alberto
相关产品推荐
相关产品推荐

