根据熊猫约束生成一列

vp7*_*vp7 6 python numpy constraints pandas

F_Date      B_Date      col   is_B
01/09/2019  02/08/2019  2200    1
01/09/2019  03/08/2019  672     1
02/09/2019  03/08/2019  1828    1
01/09/2019  04/08/2019  503     0
02/09/2019  04/08/2019  829     1
03/09/2019  04/08/2019  1367    0
02/09/2019  05/08/2019  559     1
03/09/2019  05/08/2019  922     1
04/09/2019  05/08/2019  1519    0
01/09/2019  06/08/2019  376     1
Run Code Online (Sandbox Code Playgroud)

我想生成一列c_a,以便最初输入flight_date时该值25000基于col值而减小。例如 :

预期产量:

F_Date      B_Date      col   is_B   c_a
01/09/2019  02/08/2019  2200    1    25000
01/09/2019  03/08/2019  672     1    25000 - 2200
02/09/2019  03/08/2019  1828    1    25000
01/09/2019  04/08/2019  503     0    25000 - 2200 - 672
02/09/2019  04/08/2019  829     1    25000 - 1828
03/09/2019  04/08/2019  1367    0    25000
02/09/2019  05/08/2019  559     1    25000 - 1828 - 829
03/09/2019  05/08/2019  922     1    25000 (since last value had is_B as 0)
04/09/2019  05/08/2019  1519    0    25000
01/09/2019  06/08/2019  376     1    25000 - 2200 - 672 (Since last appearance had is_B as 0)
Run Code Online (Sandbox Code Playgroud)

谁能找到大熊猫实现相同目标的方法?

Val*_*_Bo 3

我想,我找到了一个非常简洁的解决方案:

df['c_a'] = df.groupby('F_Date').apply(lambda grp:
    25000 - grp.col.where(grp.is_B.eq(1), 0).shift(fill_value=0)
    .cumsum()).reset_index(level=0, drop=True)
Run Code Online (Sandbox Code Playgroud)

结果是:

       F_Date      B_Date   col  is_B    c_a
0  01/09/2019  02/08/2019  2200     1  25000
1  01/09/2019  03/08/2019   672     1  22800
2  02/09/2019  03/08/2019  1828     1  25000
3  01/09/2019  04/08/2019   503     0  22128
4  02/09/2019  04/08/2019   829     1  23172
5  03/09/2019  04/08/2019  1367     0  25000
6  02/09/2019  05/08/2019   559     1  22343
7  03/09/2019  05/08/2019   922     1  25000
8  04/09/2019  05/08/2019  1519     0  25000
9  01/09/2019  06/08/2019   376     1  22128
Run Code Online (Sandbox Code Playgroud)

这个想法,以及基于组F_Date == '01/09/2019'的示例:

  1. grp.col.where(grp.is_B.eq(1), 0)- 从组中的下一行中减去的值:

    0    2200
    1     672
    3       0
    9     376
    
    Run Code Online (Sandbox Code Playgroud)
  2. .shift(fill_value=0)- 从组中当前行中减去的值 :

    0       0
    1    2200
    3     672
    9       0
    
    Run Code Online (Sandbox Code Playgroud)
  3. .cumsum()- 要减去的累积值:

    0       0
    1    2200
    3    2872
    9    2872
    
    Run Code Online (Sandbox Code Playgroud)
  4. 25000 - ...- 目标值:

    0    25000
    1    22800
    3    22128
    9    22128
    
    Run Code Online (Sandbox Code Playgroud)