如何用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列完全匹配你的期望输出:
| ID | Months_after_origination | Principal_payment | Origination_date | Principal_single |
|---|---|---|---|---|
| 123 | 0 | 48.32 | 10/1/2021 | 48.32 |
| 123 | 1 | 75.65 | 10/1/2021 | 27.33 |
| 123 | 2 | 234.67 | 10/1/2021 | 159.02 |
| 123 | 3 | 380.37 | 10/1/2021 | 145.70 |
内容的提问来源于stack exchange,提问作者liamsuma
相关产品推荐
相关产品推荐

