根据最后一行获取新值并检查ID

时间:2018-04-25 14:45:32

标签: python pandas

当前日期框架。

ID  Date     Start Value    Payment
111 1/1/2018    1000        0
111 1/2/2018                100
111 1/3/2018                500
111 1/4/2018                400
111 1/5/2018                0
222 4/1/2018    2000        200
222 4/2/2018                100
222 4/3/2018                700
222 4/4/2018                0
222 4/5/2018                0
222 4/6/2018                1000
222 4/7/2018                0

这是我想要的数据帧。基本上,我试图填补每一行的星值。如您所见,每个ID在第一天都有一个起始值。第二天的起始值=最后一天的起始值 - 最后一天的付款。

   ID   Date    Start Value     Payment
    111 1/1/2018    1000        0
    111 1/2/2018    1000        100
    111 1/3/2018    900         500
    111 1/4/2018    400         400
    111 1/5/2018    0           0
    222 4/1/2018    2000        200
    222 4/2/2018    1800        100
    222 4/3/2018    1700        700
    222 4/4/2018    1000        0
    222 4/5/2018    1000        0
    222 4/6/2018    1000        1000
    222 4/7/2018    0           0

现在,我使用这个公式的Excel。 起始值= if(此行中的ID = =最后一行中的ID,最后一行' s起始值 - 最后一行' s付款,起始值)

它运作良好,我想知道我是否可以在Python / Pandas中完成它。谢谢。

1 个答案:

答案 0 :(得分:2)

我们可以使用groupbyshift + cumsumffill将为同一ID下的所有行设置初始值,然后我们只需要扣除累积从那一行直到开始付款,我们得到那一点的剩余价值

df.StartValue.fillna(df.groupby('ID').apply(lambda x : x['StartValue'].ffill()-x['Payment'].shift().cumsum()).reset_index(level=0,drop=True))
Out[61]: 
0     1000.0
1     1000.0
2      900.0
3      400.0
4        0.0
5     2000.0
6     1800.0
7     1700.0
8     1000.0
9     1000.0
10    1000.0
11       0.0
Name: StartValue, dtype: float64

通过添加inplace=Ture

将其分配回来
df.StartValue.fillna(df.groupby('ID').apply(lambda x : x['StartValue'].ffill()-x['Payment'].shift().cumsum()).reset_index(level=0,drop=True),inplace=True)
df
Out[63]: 
     ID      Date  StartValue  Payment
0   111  1/1/2018      1000.0        0
1   111  1/2/2018      1000.0      100
2   111  1/3/2018       900.0      500
3   111  1/4/2018       400.0      400
4   111  1/5/2018         0.0        0
5   222  4/1/2018      2000.0      200
6   222  4/2/2018      1800.0      100
7   222  4/3/2018      1700.0      700
8   222  4/4/2018      1000.0        0
9   222  4/5/2018      1000.0        0
10  222  4/6/2018      1000.0     1000
11  222  4/7/2018         0.0        0