首页 > 解决方案 > 根据其他列值生成列

问题描述

我有一个数据框:

Date_1      Date_2     is_B weight_1
01/09/2019  02/08/2019  1   254
01/09/2019  02/08/2019  1   320
01/09/2019  04/08/2019  1   244
01/09/2019  04/08/2019  1   247
01/09/2019  14/08/2019  0   343
01/09/2019  14/08/2019  1   161
01/09/2019  14/08/2019  1   386
01/09/2019  15/08/2019  1   465
01/09/2019  15/08/2019  1   133
01/09/2019  15/08/2019  1   310
01/09/2019  15/08/2019  1   155

我想生成一个 new_weight 列,这样对于每个 date_1,new_weight 的值为 5000 - weight_1,其中 is_B 值为 1。如果 is_B = 0,那么我们将 new_weight 的旧值复制到 new_weight 中。

我知道为了计算 new_weight,我们可以这样做:

df = 5000 - df.groupby('date_1')['weight_1'].cumsum()

但我不确定如何在代码中应用 is_b 的条件。

任何人都可以建议使用 pandas 或 numpy 的方式来做同样的事情吗?

编辑

预期产出

Date_1      Date_2     is_B weight_1  new_weight
01/09/2019  02/08/2019  1   254       5000-254
01/09/2019  02/08/2019  1   320       5000-254-320 
01/09/2019  04/08/2019  1   244       5000-254-320-244
01/09/2019  04/08/2019  1   247       5000-254-320-244-247
01/09/2019  14/08/2019  0   343       5000-254-320-244-247(we won't subtract 343 as isBooked = 0)
01/09/2019  14/08/2019  1   161       .
01/09/2019  14/08/2019  1   386       . 
01/09/2019  15/08/2019  1   465       . 
01/09/2019  15/08/2019  1   133       .
01/09/2019  15/08/2019  1   310       .
01/09/2019  15/08/2019  1   155       .

谢谢

标签: pythonpandasnumpy

解决方案


尝试这个 :

df['new_weight'] = df.groupby('date_1').apply(lambda grp:
    5000 - grp.weight_1.where(grp.isBooked.eq(1), 0).cumsum()).reset_index(level=0, drop=True)

推荐阅读