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
相关产品推荐
相关产品推荐

