我有一个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数据的帮助。
1条答案
按热度按时间tyg4sfes1#
假设你想在每个名字的最后一行加上额外的金额,如果还有剩余的话,使用
clip
,mask
和duplicated
:字符串
输出量:
型
如果您取下面具,您将获得每次付款后剩余的金额:
型