按ID分组计算过去12个月数值总和的Pandas实现需求
解决方案:按ID计算过去12个月的Order_Count总和
方法1:分组后结合时间范围求和
这种方法直接针对每个ID的每条记录,筛选出该记录日期前365天内的所有数据并求和,逻辑清晰直观。
步骤:
- 转换
date列为datetime格式,保证时间运算有效 - 按
ID分组,对每组内的每条数据,计算其日期往前365天范围内的Order_Count总和 - 整理结果为新的DataFrame
代码示例:
import pandas as pd # 构造示例数据 data = { 'ID': ['X8DE9C1382D02F287B6', 'X8DE9C1382D02F212N1', 'X8DE9C1382D02F222E1', 'X8DE9C1312D02F222W1'], 'date': ['2021-04-23', '2021-04-24', '2021-04-24', '2021-05-24'], 'Order_Count': [16, 11, 9, 8] } df = pd.DataFrame(data) # 转换date列为datetime类型 df['date'] = pd.to_datetime(df['date']) # 定义函数,计算每组内每条记录的过去365天总和 def calculate_rolling_sum(group): # 按日期排序,确保时间顺序正确 group = group.sort_values('date') # 对每条记录,筛选日期在[当前date-365天, 当前date]的范围,求和 group['Past_12Months_Order_Count'] = group.apply( lambda row: group[(group['date'] >= row['date'] - pd.Timedelta(days=365)) & (group['date'] <= row['date'])]['Order_Count'].sum(), axis=1 ) return group # 按ID分组应用函数,得到结果 result_df = df.groupby('ID', group_keys=False).apply(calculate_rolling_sum) # 若需每个ID的最新日期对应过去12个月总和,可执行以下代码 latest_result_df = result_df.sort_values('date').groupby('ID').last()[['date', 'Past_12Months_Order_Count']].reset_index()
方法2:正确使用时间滚动窗口(解决你之前的问题)
你之前用滚动窗口不符合需求,大概率是未设置正确的分组和时间窗口参数。以下是正确用法:
步骤:
- 转换
date列为datetime并按ID、日期排序 - 按
ID分组后,使用rolling('365D')时间窗口求和,设置closed='right'保证包含当前日期
代码示例:
# 转换日期并排序 df['date'] = pd.to_datetime(df['date']) df_sorted = df.sort_values(['ID', 'date']) # 按ID分组,使用时间滚动窗口计算总和 df_sorted['Past_12Months_Order_Count'] = df_sorted.groupby('ID').rolling('365D', on='date', closed='right')['Order_Count'].sum().reset_index(level=0, drop=True) # 得到最终结果DataFrame result_df = df_sorted[['ID', 'date', 'Past_12Months_Order_Count']]
结果说明
- 示例数据中每个ID仅有一条记录,因此过去365天的总和等于自身
Order_Count值;若某个ID存在多时间点记录,会自动累加符合时间范围的数值。 - 若只需每个ID的最新时间点对应过去12个月总和,对结果按ID分组取最后一条记录即可。
内容的提问来源于stack exchange,提问作者Sandeepan Mukherjee
相关产品推荐
相关产品推荐

