基于销量峰值周的Group by分组周距计算及新变量生成需求
解决按ID分组计算峰值周距离的问题
我来帮你搞定这个数据集处理需求,用Python的Pandas库就能完美实现,完全贴合你给出的规则。下面是具体的步骤和代码示例:
需求回顾
- 按
Id字段对数据集分组 - 每个分组内,找到销量最高的那一周(峰值周)
- 生成新变量
output:峰值周的值为0,其他周的值为该周与峰值周的间隔绝对值(比如峰值周是第3周,第2周就是1,第5周就是2,以此类推)
代码实现
首先我们先构造你提供的样例数据,然后执行分组计算:
import pandas as pd # 构建样例数据集 sample_data = { 'Id': ['ppr5007288231'] * 8 + ['ppr5007288232'] * 3, 'week': [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3], 'sales': [3750.84, 4562.75, 12649.65, 4926.81, 5226.09, 6672.11, 6833.04, 6759.29, 7021.55, 9031.93, 6240.72] } df = pd.DataFrame(sample_data) # 定义分组处理函数 def compute_peak_distance(group): # 找到分组内销量最高的周(若多个周销量相同,取第一个出现的峰值周) peak_week = group.loc[group['sales'].idxmax(), 'week'] # 计算每个周与峰值周的间隔绝对值 group['output'] = abs(group['week'] - peak_week) return group # 按ID分组应用函数,重置索引 result_df = df.groupby('Id').apply(compute_peak_distance).reset_index(drop=True) print(result_df)
结果验证
运行代码后得到的result_df和你给出的样例输出完全一致:
| Id | week | sales | output | |
|---|---|---|---|---|
| 0 | ppr5007288231 | 1 | 3750.84 | 2 |
| 1 | ppr5007288231 | 2 | 4562.75 | 1 |
| 2 | ppr5007288231 | 3 | 12649.65 | 0 |
| 3 | ppr5007288231 | 4 | 4926.81 | 1 |
| 4 | ppr5007288231 | 5 | 5226.09 | 2 |
| 5 | ppr5007288231 | 6 | 6672.11 | 3 |
| 6 | ppr5007288231 | 7 | 6833.04 | 4 |
| 7 | ppr5007288231 | 8 | 6759.29 | 5 |
| 8 | ppr5007288232 | 1 | 7021.55 | 1 |
| 9 | ppr5007288232 | 2 | 9031.93 | 0 |
| 10 | ppr5007288232 | 3 | 6240.72 | 1 |
扩展说明
如果你的数据集存在多个峰值周(即同一个分组内有多个周的销量同为最大值),当前代码会取第一个出现的峰值周作为基准。如果需要调整逻辑(比如取所有峰值周的平均值作为基准,或者计算每个周到最近峰值周的距离),可以修改compute_peak_distance函数:
# 示例:计算到最近峰值周的距离 def compute_nearest_peak_distance(group): # 获取所有峰值周的列表 peak_weeks = group[group['sales'] == group['sales'].max()]['week'].tolist() # 计算每个周到最近峰值周的距离 group['output'] = group['week'].apply(lambda x: min(abs(x - pw) for pw in peak_weeks)) return group
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

