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

