如何让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
相关产品推荐
相关产品推荐

