如何按ID和自定义时间区间分组求和,并合并前3组销售额?
解决方案
步骤1:预处理日期并计算相对天数
首先需要把日期列转为标准datetime格式,再按每个ID计算每条记录相对于该ID最早日期的天数差(让最早日期对应第1天)。假设分组后的数据框名为grouped_df,先重置索引方便操作:
import pandas as pd # 重置索引,将ID和DATE从多级索引转为普通列 df = grouped_df.reset_index() # 转换日期格式(匹配示例中的dd/mm/yy格式) df['DATE'] = pd.to_datetime(df['DATE'], format='%d/%m/%y') # 按ID分组,计算每条数据的相对天数 df['relative_day'] = df.groupby('ID')['DATE'].transform(lambda x: (x - x.min()).dt.days + 1)
步骤2:划分自定义区间并计算各区间销售额
用pd.cut将相对天数映射到指定区间,再按ID和区间分组求和:
# 定义区间边界与对应标签 bins = [0, 4, 10, 18, 28, float('inf')] labels = ['第1-4天', '第5-10天', '第11-18天', '第19-28天', '28天之后'] # 为每条数据标记所属区间 df['date_interval'] = pd.cut(df['relative_day'], bins=bins, labels=labels, right=False) # 按ID和区间分组,计算销售额总和(替换"销售额列名"为实际列名) interval_sales = df.groupby(['ID', 'date_interval'])['销售额列名'].sum().unstack(fill_value=0)
注意:务必将代码中的
销售额列名替换为你数据里实际存储销售额的列名称。
步骤3:合并前3个区间的销售额
直接对前3个区间的列求和,可新增合并列或生成仅保留合并后区间的新数据框:
# 新增合并列,保留原区间数据 interval_sales['第1-18天(合并前3区间)'] = interval_sales[['第1-4天', '第5-10天', '第11-18天']].sum(axis=1) # 若只需保留合并后的区间与剩余两个区间,执行以下代码 merged_sales = interval_sales[['第1-18天(合并前3区间)', '第19-28天', '28天之后']]
最终输出示例
处理后的数据结构大致如下:
| ID | 第1-4天 | 第5-10天 | 第11-18天 | 第19-28天 | 28天之后 | 第1-18天(合并前3区间) |
|---|---|---|---|---|---|---|
| 8259951 | 3000.0 | 11150.0 | 6000.0 | 0.0 | 0.0 | 20150.0 |
| 148173081 | 0.0 | 0.0 | 0.0 | 0.0 | 150.0 | 0.0 |
内容的提问来源于stack exchange,提问作者Nh11
相关产品推荐
相关产品推荐

