我有一个像这样的数据框:
data = {'id':[1,1,1,2,2],
'prod_type':['A','B','C','A','C'],
'prod_order':[1,3,2,2,1],
'prod_price':[100,150,300,10,40]
'prod_pool':[200,200,200,45,45]
}
对于 id 标识的每个组,我需要按产品订单订购产品,并用可用池逐行限制价格,但每一步都会消耗产品池。
所以第一行我会得到 id=1, prod_type=A, prod_used=min(prod_price,prod_pool)
然后第二行 id=1, prod_type=C, prod_used=min(prod_price,max(0,prod_pool(productA)-prod_used(productA)))
所以基本上每次产品“使用”部分池时,池就会减少该数量。 池子不能为负数,所以一旦用完就没有剩余,必须为 0。
groupby.apply
与自定义函数一起使用:
def quantity(g):
# compute the shifted difference
s = g['prod_pool'].sub(g['prod_price'].shift()).fillna(g['prod_price'])
# stop at the first negative value
return s.where(s.gt(0).cummin(), 0)
df['product_used'] = df.groupby('id', group_keys=False).apply(quantity)
输出:
id prod_type prod_order prod_price prod_pool product_used
0 1 A 1 100 200 100.0
2 1 C 2 300 200 100.0
1 1 B 3 150 200 0.0
4 2 C 1 40 45 40.0
3 2 A 2 10 45 5.0