Python:根据累计和从DataFrame中减去值

zpgglvta  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(101)

我有一个DataFrame 1

df1 = pd.DataFrame({
    'name': ['virat', 'virat', 'virat', 'virat', 'virat', 'rohit', 'rohit'],
    'amount': [1000, 500, 200, 500, 150, 120, 100]})

字符串
DataFrame 2

df2 = pd.DataFrame({
    'name': ['virat', 'rohit'],
    'amount_paid': [1400, 300]})


dataframe2中的名称是唯一的。使用df2中的amount_paid列。开始以升序扣除价值,并在df2中的amount_paid被完全使用后停止。
如果有一个额外的金额在添加一个新的列amount_extra
预期产出:

name    amount_left   amount_used_to_knock_off      amount_extra
0   virat   0                1000                          0
1   virat   100               400                          0
2   virat   200                 0                          0
3   virat   500                 0                          0
4   virat   150                 0                          0
5   rohit   0                 120                          0
6   rohit   0                 100                         80


我们已经尝试过(使用this code):

s = (df1
 .groupby('name')['amount'].cumsum()
 .sub(df1['name'].map(df2.set_index('name')['amount_paid']))
)

df1['amount_left'] = df1['amount'].mask(s.lt(df1['amount']), s.clip(lower=0))

df1['amount_used_to_knock_off'] = (df1['amount'].sub(s).clip(lower=0)
                                   .mask(s<0, df1['amount'])
                                   )


输出量:

name  amount  amount_left  amount_used_to_knock_off
0  virat    1000            0                      1000
1  virat     500          100                       400
2  virat     200          200                         0
3  virat     500          500                         0
4  virat     150          150                         0
5  rohit     120            0                       120
6  rohit     100            0                       100


需要有关获取amount_extra数据的帮助。

tyg4sfes

tyg4sfes1#

假设你想在每个名字的最后一行加上额外的金额,如果还有剩余的话,使用clipmaskduplicated

df1['amount_extra'] = ((-s).clip(lower=0)
                       .mask(df1['name'].duplicated(keep='last'), 0)
                      )

字符串
输出量:

name  amount  amount_left  amount_used_to_knock_off  amount_extra
0  virat    1000            0                      1000             0
1  virat     500          100                       400             0
2  virat     200          200                         0             0
3  virat     500          500                         0             0
4  virat     150          150                         0             0
5  rohit     120            0                       120             0
6  rohit     100            0                       100            80


如果您取下面具,您将获得每次付款后剩余的金额:

name  amount  amount_left  amount_used_to_knock_off  amount_extra
0  virat    1000            0                      1000           400
1  virat     500          100                       400             0
2  virat     200          200                         0             0
3  virat     500          500                         0             0
4  virat     150          150                         0             0
5  rohit     120            0                       120           180
6  rohit     100            0                       100            80

相关问题