You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python Pandas反转Excel累计付款列并实现类Maxifs功能?

解决Pandas中按ID将累计本金付款转为单次付款的问题

你的需求本质是按唯一ID分组,将累计的本金付款值转换为当月单次付款金额——也就是当前行的累计值减去上一行的累计值(首行直接取原值),和Excel里用「当前值-上一期值」的逻辑一致,并非需要Maxifs函数。

你的代码问题分析

你之前的代码逻辑错误:

a_df["Principal_single"] = a_df["Principal_payment"].where(a_df["Months_after_origination"] < a_df["Months_after_origination"].values).groupby(a_df["ID"]).transform("max")

a_df["Months_after_origination"] < a_df["Months_after_origination"].values是逐行与整个列的所有值比较,结果全为False,导致where返回全NaN,后续分组取max自然还是NaN。

正确解决方案

方法1:使用diff()计算差分

diff()函数会直接计算分组内当前值与上一行值的差值,首行差值为NaN,用原Principal_payment填充即可:

# 按ID分组计算累计值的差分
a_df["Principal_single"] = a_df.groupby("ID")["Principal_payment"].diff()
# 填充首行的NaN为原累计值
a_df["Principal_single"] = a_df["Principal_single"].fillna(a_df["Principal_payment"])
# 保留两位小数(与示例输出一致)
a_df["Principal_single"] = a_df["Principal_single"].round(2)

方法2:使用shift()直接做减法

通过shift(1)获取上一行的累计值,用当前值减去上一行值,首行没有上一行则用0填充:

# 按ID分组获取上一期累计值,首行填充0
prev_principal = a_df.groupby("ID")["Principal_payment"].shift(1, fill_value=0)
# 计算单次付款金额
a_df["Principal_single"] = a_df["Principal_payment"] - prev_principal
# 保留两位小数
a_df["Principal_single"] = a_df["Principal_single"].round(2)

验证结果

运行上述代码后,得到的Principal_single列完全匹配你的期望输出:

IDMonths_after_originationPrincipal_paymentOrigination_datePrincipal_single
123048.3210/1/202148.32
123175.6510/1/202127.33
1232234.6710/1/2021159.02
1233380.3710/1/2021145.70

内容的提问来源于stack exchange,提问作者liamsuma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:00:57