Python-Pandas 按列值的升序减去列值

2024-01-12

有一个数据框mortgage_data,其中列名称为mortgage_amount 和month(按升序排列)

mortgage_amount_paid = 1000

抵押数据:

name   mortgage_amount  month 
mark     400              1
mark     500              2
mark     200              3

如何扣除和更新mortgage_amount按升序或月份使用mortgage_amount_paid数据框中逐行 并添加一列paid_status如果 Mortgage_amount_paid 已完全扣除该金额,则为“是”;如果不是这样,则为“否”

if mortgage_amount_paid = 1000抵押数据:

name   mortgage_amount  month  mortgage_amount_updated  paid_status 
mark     400              1         0                     full
mark     500              2         0                     full
mark     200              3       100                     partial

ex:

if mortgage_amount_paid = 600

抵押数据:

name   mortgage_amount  month  mortgage_amount_updated  paid_status 
mark     400              1         0                     full
mark     500              2       300                     partial
mark     200              3       200                     zero

尝试过这个:

mortgage_amount_paid = 600

# amount saved - debt
m1 = df['mortgage_amount'].cumsum().sub(mortgage_amount_paid)
# is it positive?
m2 = m1>0
# is the previous month also positive?
m3 = m2.shift(fill_value=False)

df['mortgage_amount_updated'] = (m1.clip(0, mortgage_amount_paid)
                                   .mask(m3, df['mortgage_amount'])
                                 )
df['paid_status'] = np.select([m3, m2], ['zero', 'partial'], 'full')

错误:我已经给出mortgage_amount_paid=400。已付费状态应为已付费,零,零。我得到报酬,部分,零

and

mortgage_amount_paid = 600

m = df['mortgage_amount'].cumsum()

df['paid_status'] = np.select(
    [m <= mortgage_amount_paid,
     (m > mortgage_amount_paid) & (m.shift() < mortgage_amount_paid)
     ],
    ['full', 'partial'],
    default='zero'
)
df['mortgage_amount_updated'] = np.select(
    [df['paid_status'].eq('full'),
     df['paid_status'].eq('partial')],
    [0, m-mortgage_amount_paid],
    default=df['mortgage_amount']
)

错误:如果mortgage_amount_paid=1paid_status应该是partial,zero,zero。我得到部分零,零,零


你可以写一个函数:

def new(mortgage_amount_paid, df):
    m = df.mortgage_amount.cumsum()
    n = mortgage_amount_paid
    df['paid_status'] = np.where(m < n, 'full', 
             np.where(m - n < df.mortgage_amount, 'partial', 'zero'))
    return df # You do not have to since it does inplace replacement


new(600, df)
   name  mortgage_amount  month paid_status
0  mark              400      1        full
1  mark              500      2     partial
2  mark              200      3        zero

new(1000, df)
   name  mortgage_amount  month paid_status
0  mark              400      1        full
1  mark              500      2        full
2  mark              200      3     partial

new(100, df)
   name  mortgage_amount  month paid_status
0  mark              400      1     partial
1  mark              500      2        zero
2  mark              200      3        zero

new(2000, df)
   name  mortgage_amount  month paid_status
0  mark              400      1        full
1  mark              500      2        full
2  mark              200      3        full
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python-Pandas 按列值的升序减去列值 的相关文章

随机推荐