如何用Python按产品类别基于递归数据生成衍生列inventory与oh_avg
问题描述
我有一个包含code、inbound、sell字段的DataFrame,希望按产品类别添加inventory和oh_avg列,计算逻辑如下:
inventory:当前行inbound - sell加上上一行同产品的inventory,首行则直接为inbound - selloh_avg:当前行inventory除以该产品截至当前行的所有历史sell的均值
示例数据如下:
idx product inbound sell inventory oh_avg 1 1 6 3 3 1 (3/mean(3)) 2 1 4 6 1 0.22 (1/mean(3+6)) 3 1 4 0 5 1.67 (5/mean(3+6+0)) 4 2 20 10 10 1 (10/mean(10)) 5 2 10 5 15 2 (15/mean(10+5))
实现方案
通过Pandas的分组与累计计算功能即可实现需求,代码如下:
import pandas as pd # 构造示例数据(实际使用时替换为你的数据源) data = { 'idx': [1,2,3,4,5], 'product': [1,1,1,2,2], 'inbound': [6,4,4,20,10], 'sell': [3,6,0,10,5] } df = pd.DataFrame(data) # 1. 计算inventory:按产品分组后,对(inbound - sell)做累计求和 df['inventory'] = df.groupby('product').apply( lambda x: (x['inbound'] - x['sell']).cumsum() ).reset_index(level=0, drop=True) # 2. 计算oh_avg:先求每个产品截至当前行的sell累计均值,再用inventory除以该均值 df['sell_cum_mean'] = df.groupby('product')['sell'].expanding().mean().reset_index(level=0, drop=True) df['oh_avg'] = df['inventory'] / df['sell_cum_mean'] # 可选:保留两位小数,与示例格式对齐 df['oh_avg'] = df['oh_avg'].round(2) print(df)
代码说明
inventory计算:对每个产品组的inbound - sell差值做累计求和,自动实现"当前行差值+上一行库存"的逻辑,首行直接取差值- 累计均值计算:
expanding().mean()会对每个产品组从第一行到当前行的sell值计算均值,正好匹配"所有历史sales均值"的要求 - 最后通过除法得到
oh_avg,可选保留两位小数让结果更贴合示例
运行后输出结果与示例一致:
idx product inbound sell inventory sell_cum_mean oh_avg 0 1 1 6 3 3 3.0 1.00 1 2 1 4 6 1 4.5 0.22 2 3 1 4 0 5 3.0 1.67 3 4 2 20 10 10 10.0 1.00 4 5 2 10 5 15 7.5 2.00
内容的提问来源于stack exchange,提问作者Fernando Quintino
相关产品推荐
相关产品推荐

