如何在季度数据集上按Item计算全指标的环比差值?
计算分组环比差值的最优方案
你的核心需求是按items分组,对每个分组内的所有metric计算环比差值,直接用df.diff()会混淆不同item的周期数据,所以必须结合分组逻辑处理,以下是高效简洁的实现方案:
步骤1:规范数据顺序
先把period转为日期格式,再按items和period排序,保证每个item的周期是时间递增顺序:
import pandas as pd df['period'] = pd.to_datetime(df['period']) df = df.sort_values(['items', 'period']).reset_index(drop=True)
步骤2:批量计算分组环比差值
利用groupby配合diff(),一次性处理所有metric列,生成对应的差值列:
# 自动筛选所有metric列(如果列名有固定规律,比如包含'metric') metric_cols = [col for col in df.columns if 'metric' in col] # 分组计算环比差值,新增列命名为`diff_原列名` df[[f'diff_{col}' for col in metric_cols]] = df.groupby('items')[metric_cols].diff()
可选:计算环比增长率
如果需要的是增长率((当期值-上期值)/上期值),把diff()替换为pct_change()即可:
df[[f'pct_{col}' for col in metric_cols]] = df.groupby('items')[metric_cols].pct_change() * 100
方案优势
- 原生pandas方法,性能高效,处理30个metric毫无压力,远快于循环遍历
- 代码简洁,无需额外复杂逻辑,自动保留原数据结构
- 第一个周期因无前置数据会显示
NaN,符合业务逻辑
处理后示例结果
| idx | items | period | metric 1 | metric 2 | diff_metric 1 | diff_metric 2 |
|---|---|---|---|---|---|---|
| 0 | Item A | 2022-12-31 | 68 | 100 | NaN | NaN |
| 1 | Item A | 2023-06-30 | 72 | 99 | 4.0 | -1.0 |
| 2 | Item A | 2023-09-30 | 88 | 98 | 16.0 | -1.0 |
| 3 | Item B | 2022-12-31 | 13 | 100 | NaN | NaN |
| 4 | Item B | 2023-06-30 | 68 | 90 | 55.0 | -10.0 |
| 5 | Item B | 2023-09-30 | 50 | 80 | -18.0 | -10.0 |
内容的提问来源于stack exchange,提问作者ChrisLK
相关产品推荐
相关产品推荐

