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

如何在Pandas中实现特定SUMPRODUCT逻辑的列表推导式

解决DataFrame中带利息的SUMPRODUCT通用计算问题

先定义基础的DataFrame:

import pandas as pd

df = pd.DataFrame({"age" : [0, 5, 10, 15, 20], "income": [5, 13, 23, 18, 12]})

我们的需求是为每个行索引x,计算从第0行到第x行的累加值,核心是通用化处理age[x] - age[y](y从0到x)的年龄差,下面分两种场景实现:

1. 无利息的原始SUMPRODUCT计算

直接用列表推导式遍历每个x,再嵌套遍历0到x的所有y,计算对应项的乘积后求和:

# 计算无利息的SUMPRODUCT值
df['sum_product_no_interest'] = [
    sum(df['income'].iloc[y] * (df['age'].iloc[x] - df['age'].iloc[y]) for y in range(x+1))
    for x in range(len(df))
]

比如x=3(对应age=15)时,计算结果为338,和示例一致。

2. 引入利息的SUMPRODUCT计算

把乘法项替换为interest ** (age[x] - age[y])即可,这里设定interest=1.03:

interest = 1.03
# 计算带利息的SUMPRODUCT值
df['sum_product_with_interest'] = [
    sum(df['income'].iloc[y] * (interest ** (df['age'].iloc[x] - df['age'].iloc[y])) for y in range(x+1))
    for x in range(len(df))
]

x=3时的计算结果约为69.92,符合示例要求。

优化:向量化实现(适合大数据集)

如果数据量较大,循环的效率会偏低,可以用Pandas的广播机制实现向量化计算:

interest = 1.03
# 构造年龄差矩阵:每行是当前age减去所有行的age
age_diff_matrix = df['age'].values.reshape(-1, 1) - df['age'].values
# 只保留y <= x的部分(年龄差非负),其余设为0
mask = age_diff_matrix >= 0
# 生成利息乘数矩阵
interest_multiplier = interest ** age_diff_matrix
interest_multiplier[~mask] = 0
# 矩阵乘法直接计算每行的累加值
df['sum_product_vectorized'] = df['income'].values @ interest_multiplier

这种方式避免了显式循环,计算效率会提升很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:46:17