You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas多产品名称下移位运算结果异常求助

问题:Pandas分组计算升降幅百分比时引用错误的上一行值

我编写了一段Pandas代码,先通过groupby分组求和处理数据,再按PRODUCT_NAME和PROMO_DEPTH分组计算SUM_PROD_SELL_QTY的差值,最后将差值与上一行的SUM_PROD_SELL_QTY相除得到升降幅百分比。但实际输出中,对于同PRODUCT_NAME(HYDT300ML)和同PROMO_DEPTH(0.3)的行,计算时错误取了非分组内的上一行值(20),而非预期的29,导致结果不符。

原代码

df = pd.DataFrame({'PRODUCT_NAME':['HYDT300ML','HYDT300ML', 'NEW', 'HYDT300ML', 'NEW', 'HYDT300ML','HYDT300ML'],
           'WEEK_NUMBER':[1, 1, 1, 2, 2, 1, 3],
           'PROMO_DEPTH':[0, 0.3, 0.3, 0.3, 0.3, 0.5, 0.3],
           'SUM_PROD_SELL_QTY':[6, 29, 11, 10, 19, 20, 45]})

df_groupby = df.groupby(['PRODUCT_NAME', 'WEEK_NUMBER', 'PROMO_DEPTH'])['SUM_PROD_SELL_QTY'].sum().reset_index()

# 按PRODUCT_NAME、WEEK_NUMBER、PROMO_DEPTH分组计算SUM_PROD_SELL_QTY的差值
df_groupby['difference'] = df_groupby.groupby(['PRODUCT_NAME', 'PROMO_DEPTH'])['SUM_PROD_SELL_QTY'].diff()

# 计算升降幅百分比,预期差值除以分组内上一行的SUM_PROD_SELL_QTY
df_groupby['uplift_downlift_percentage'] = df_groupby['difference'] / df_groupby['SUM_PROD_SELL_QTY'].shift(1)

df_groupby

当前输出

PRODUCT_NAME  WEEK_NUMBER  PROMO_DEPTH  SUM_PROD_SELL_QTY  difference  uplift_downlift_percentage
0       HYDT300ML            1          0.0                  6         NaN                         NaN
1       HYDT300ML            1          0.3                 29         NaN                         NaN
2       HYDT300ML            1          0.5                 20         NaN                         NaN
3       HYDT300ML            2          0.3                 10       -19.0                    -0.950000
4       HYDT300ML            3          0.3                 45        35.0                     3.500000
5             NEW            1          0.3                 11         NaN                         NaN
6             NEW            2          0.3                 19         8.0                     0.727273

预期输出

PRODUCT_NAME  WEEK_NUMBER  PROMO_DEPTH  SUM_PROD_SELL_QTY  difference  uplift_downlift_percentage
0       HYDT300ML            1          0.0                  6         NaN                         NaN
1       HYDT300ML            1          0.3                 29         NaN                         NaN
2       HYDT300ML            1          0.5                 20         NaN                         NaN
3       HYDT300ML            2          0.3                 10       -19.0                    -0.655
4       HYDT300ML            3          0.3                 45        35.0                     3.500000
5             NEW            1          0.3                 11         NaN                         NaN
6             NEW            2          0.3                 19         8.0                     0.727273

解决方案

问题出在计算uplift_downlift_percentage时,使用了全局的shift(1),导致跨分组引用了上一行的值。正确的做法是在相同的分组(PRODUCT_NAME + PROMO_DEPTH)内取上一行的SUM_PROD_SELL_QTY,和计算difference的分组逻辑保持一致。

修改后的关键代码行:

df_groupby['uplift_downlift_percentage'] = df_groupby['difference'] / df_groupby.groupby(['PRODUCT_NAME', 'PROMO_DEPTH'])['SUM_PROD_SELL_QTY'].shift(1)

修改后,HYDT300ML+0.3分组内的第3行差值-19会除以分组内上一行的29,得到-19/29≈-0.655,完全符合预期输出。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:15:34