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

如何让Python函数返回DataFrame所有行的ppmt计算结果?

解决遍历DataFrame计算并保存所有结果的问题

问题根源

你函数里的return (p)会在第一次满足balance > 0时立即终止函数,所以只能拿到第一个行的计算结果。另外函数参数是df,但循环用了df_principal,这是个错误,会导致函数无法正确使用传入的DataFrame。

解决方案1:用列表收集所有结果后返回

修改函数,先创建一个列表存储每一行的计算结果,最后合并返回:

import numpy_financial as npf
import pandas as pd

def principal_loop2(df, col1, col2, col3):
    all_results = []
    # 遍历传入的df,而非全局变量df_principal
    for _, row in df.iterrows():
        balance = row[col1]
        suku_bunga = row[col2]
        terms = int(row[col3])
        periode = range(1, terms + 1)
        
        if balance > 0:
            p = npf.ppmt(
                rate=suku_bunga / 12,
                per=periode,
                nper=terms,
                pv=-balance
            )
            all_results.append(p)
    
    # 合并所有结果为一个NumPy数组,无结果时返回空数组
    return np.concatenate(all_results) if all_results else np.array([])

使用示例

# 传入你的DataFrame和对应列名
total_payments = principal_loop2(df_principal, 'balance', 'interest_rate', 'terms')
# 转成DataFrame
payments_df = pd.DataFrame(total_payments, columns=['principal_payment'])

解决方案2:用apply高效处理(推荐)

iterrows性能较差,大数据量时更明显,推荐用apply对每行计算,再整理结果:

def calc_ppmt(row, col1, col2, col3):
    balance = row[col1]
    suku_bunga = row[col2]
    terms = int(row[col3])
    periode = range(1, terms + 1)
    
    if balance > 0:
        return npf.ppmt(rate=suku_bunga/12, per=periode, nper=terms, pv=-balance)
    return []

# 对每行应用函数,新增列存储每行的计算数组
df_principal['payment_arrays'] = df_principal.apply(calc_ppmt, axis=1, args=('balance', 'interest_rate', 'terms'))

# 可选:把每个期数的支付拆成单独行,保留原行的其他字段
expanded_df = df_principal.explode('payment_arrays').rename(columns={'payment_arrays': 'principal_payment'})

额外注意点

  • 若不同行的terms不同,计算出的p长度会有差异:用np.concatenate可合并成一维数组;用explode则会拆分每个期数的支付为单独行,保留原数据的关联信息。
  • 变量名尽量遵循Python小写加下划线的规范(比如Suku_bunga改成suku_bunga),提升代码可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:27:18